ITSMIncidentProblemManagement
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 Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package ITSMIncidentProblemManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.0.93</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.0.93</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, the ticket types and states that were added during installation will be deactivated.
They can be activated again in the admin area.
<br>
<br>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Ticket-Typen und -Status deaktiviert.
Diese können jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.0.93</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu aktualisieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.0.93</li>
</ul>
<br>
((enjoy))<br>
<br>
ITSMCore
# 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 = '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."
);
}
}
# cleanup stats list
{
# load required modules
$Self->{MainObject}->Require('Kernel::System::CSV');
$Self->{MainObject}->Require('Kernel::System::Group');
$Self->{MainObject}->Require('Kernel::System::User');
$Self->{MainObject}->Require('Kernel::System::Stats');
# create needed objects
$Self->{CSVObject} = Kernel::System::CSV->new( %{$Self} );
$Self->{GroupObject} = Kernel::System::Group->new( %{$Self} );
$Self->{UserObject} = Kernel::System::User->new( %{$Self} );
$Self->{StatsObject} = Kernel::System::Stats->new(
%{$Self},
UserID => 1,
);
# cleanup stats list
$Self->{StatsObject}->StatsCleanUp();
}
# 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:32:14
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNVGlja2V0LnhtbCx2IDEuNyAyMDA4LzA4LzI1IDE3OjA1OjEwIG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZGRpdGlvbmFsIElUU00gVGlja2V0IEZpZWxkczwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0RGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRUaWNrZXREZWNpc2lvbiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50VGlja2V0RGVjaXNpb24tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGlja2V0IERlY2lzaW9uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5EZWNpc2lvbjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzMxNS1BZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBsaW5rIGluIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1c+R0emxpY2hlIElUU00gRmVsZGVyLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFRpY2tldGFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5BZGRpdGlvbmFsIElUU00gRmllbGRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQmYW1wO1RpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM0MjAtRGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBkZWNpc2lvbiBsaW5rIGluIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIEVudHNjaGVpZHVuZy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBUaWNrZXRhbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5BZGQgYSBkZWNpc2lvbiE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb24mYW1wO1RpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgb3B0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGUgUmVjaHRlIHp1ciBCZWFyYmVpdHVuZyBkZXMgVGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNSZXF1aXJlZExvY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkLiBJbiBjYXNlIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkLCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIHRpY2tldCBvd25lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RWluZSBUaWNrZXQtU3BlcnJlIHdpcmQgYmVu9nRpZ3QuIFdlbm4gVGlja2V0IG5pY2h0IGdlc3BlcnJ0IGlzdCwgd2lyZCBkYXMgVGlja2V0IGF1dG9tYXRpc2NoIGdlc3BlcnJ0IHVuZCBkZXIgQWdlbnQgYWxzIEJlc2l0emVyIGdlc2V0enQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSB0aWNrZXQgdHlwZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFRpY2tldC1UeXAgZ2VzZXR6dCB3ZXJkZW4gc29sbCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXYgc2VpbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSBzZXJ2aWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgU2VydmljZSBnZXNldHp0IHdlcmRlbiBzb2xsIChUaWNrZXQ6OlNlcnZpY2UgbXVzcyBha3RpdiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI093bmVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSBvd25lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgQmVzaXR6ZXIgZ2VzZXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1Jlc3BvbnNpYmxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSByZXNwb25zaWJsZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgVmVyYW50d29ydGxpY2hlIGdlc2V0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldvdWxkIHlvdSBsaWtlIHRvIHNldCB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50PzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBTdGF0dXMgZWluZXMgVGlja2V0cyBnZXNldHp0IHdlcmRlbiBr9m5uZW4sIHdlbm4gZWluZSBOb3RpeiBkdXJjaCBlaW5lbiBBZ2VudCBhbmdlbGVndCB3aXJkPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuZXh0IHN0YXRlcyBhZnRlciBhZGRpbmcgYSBub3RlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5O5GNoc3Rt9mdsaWNoZSBTdGF0dXMgbmFjaCBkZW0gSGluenVm/GdlbiBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmNsb3NlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcmVtaW5kZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmV4dCBzdGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmRt5N9pZyBhdXNnZXfkaGx0ZXIgbuRjaHN0ZXIgU3RhdHVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPm9wZW48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjTm90ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgbm90ZSBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVpbmdhYmVt9mdsaWNoa2VpdCBm/HIgTm90aXouPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdWJqZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHN1YmplY3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkdGV4dCBpbSBCZXRyZWZmIGVpbmVyIE5vdGl6LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiRUZXh0eyJOb3RlIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjQm9keSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbm90ZSB0ZXh0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZHRleHQgaW0gVGV4dGZlbGQgZWluZXIgTm90aXouPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT48L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBzZWxlY3Rpb24gb2YgaW52b2x2ZWQgYWdlbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciBpbnZvbHZpZXJ0ZW4gQWdlbnRzIGFuemVpZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSW5mb3JtQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHNlbGVjdGlvbiBvZiBhZ2VudHMgdG8gaW5mb3JtIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXVzd2FobCBkZXIgenUgaW5mb3JtaWVyZW5kZW4gQWdlbnRzIGFuemVpZ2VuIChhbGxlIEFnZW50ZW4gbWl0ICJub3RpeiIgUmVjaHRlbiBhbSBUaWNrZXQvUXVldWUpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjQXJ0aWNsZVR5cGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlZvcmVpbmdlc3RlbGx0ZXIgTm90aXp0eXAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TcGVjaWZ5IHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIHN5c3RlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gZGllIHZlcnNjaGllZGVuZW4gTm90aXotVHlwZW4gZmVzdGdlbGVndCB3ZXJkZW4sIGRpZSBpbm5lcmhhbGIgZGVzIFN5c3RlbXMgdmVyd2VuZGV0IHdlcmRlbiBzb2xsZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWludGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWV4dGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLXJlcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgcHJpb3JpdHkgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TfZnbGljaGtlaXQgZWluZSBQcmlvcml05HQgYXVzenV35GhsZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHByaW9yaXR5IG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmF1bHQgQXVzd2FobCBkZXIgUHJpb3JpdOR0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjMgbm9ybWFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpdGxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB0aXRsZSBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVpbmdhYmVt9mdsaWNoa2VpdCBm/HIgVGl0bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBUaWNrZXQtRnJlaS1UZXh0LUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LCAyID0gQWt0aXZpZXJ0IHVuZCBQZmxpY2h0ZmVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGltZSBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIFRpY2tldC1GcmVpLVRpbWUtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlRnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biBhcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBBcnRpa2VsLUZyZWktVGV4dC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGlzdG9yeSB0eXBlIGZvciB0aGlzIGFjdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGlzdG9yaWVudHlwIGb8ciBkaWVzZSBBa3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+QWRkTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNIaXN0b3J5Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhpc3RvcnkgY29tbWVudCBmb3IgdGhpcyBhY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpc3RvcmllbmtvbW1lbnRhciBm/HIgZGllc2UgQWt0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiUlRnJlZVRleHQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG9wdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlIFJlY2h0ZSB6dXIgQmVhcmJlaXR1bmcgZGVzIFRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVxdWlyZWRMb2NrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZC4gSW4gY2FzZSB0aGUgdGlja2V0IGlzbid0IGxvY2tlZCwgdGhlIHRpY2tldHMgZ2V0IGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyB0aWNrZXQgb3duZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVpbmUgVGlja2V0LVNwZXJyZSB3aXJkIGJlbvZ0aWd0IGJ6dy4gd2VubiBUaWNrZXQgbmljaHQgZ2VzcGVycnQgaXN0LCB3aXJkIGRhcyBUaWNrZXQgYXV0b21hdGlzY2ggZ2VzcGVycnQgdW5kIGRlciBBZ2VudCBhbHMgQmVzaXR6ZXIgZ2VzZXR6dC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1RpY2tldFR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHRpY2tldCB0eXBlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgVGlja2V0LVR5cCBnZXNldHp0IHdlcmRlbiBzb2xsIChUaWNrZXQ6OlR5cGUgbXVzcyBha3RpdiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHNlcnZpY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBTZXJ2aWNlIGdlc2V0enQgd2VyZGVuIHNvbGwgKFRpY2tldDo6U2VydmljZSBtdXNzIGFrdGl2IHNlaW4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjT3duZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIG93bmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBCZXNpdHplciBnZXNldHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHJlc3BvbnNpYmxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBWZXJhbnR3b3J0bGljaGUgZ2VzZXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V291bGQgeW91IGxpa2UgdG8gc2V0IHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpZiBhIG5vdGUgaXMgY3JlYXRlZCBieSBhbiBhZ2VudD88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U29sbCBkZXIgU3RhdHVzIGVpbmVzIFRpY2tldHMgZ2VzZXR6dCB3ZXJkZW4ga/ZubmVuLCB3ZW5uIGVpbmUgTm90aXogZHVyY2ggZWluZW4gQWdlbnQgYW5nZWxlZ3Qgd2lyZD88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmV4dCBzdGF0ZXMgYWZ0ZXIgYWRkaW5nIGEgbm90ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TuRjaHN0bfZnbGljaGUgU3RhdHVzIG5hY2ggZGVtIEhpbnp1ZvxnZW4gZWluZXIgTm90aXouPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPm9wZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5leHQgc3RhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkbeTfaWcgYXVzZ2V35GhsdGVyIG7kY2hzdGVyIFN0YXR1cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5vcGVuPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI05vdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IG5vdGUgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5nYWJlbfZnbGljaGtlaXQgZvxyIE5vdGl6LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3ViamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbm90ZSBzdWJqZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZHRleHQgaW0gQmV0cmVmZiBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4kVGV4dHsiRGVjaXNpb24ifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHRleHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkdGV4dCBpbSBUZXh0ZmVsZCBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFRleHRBcmVhPiRUZXh0eyJSZWFzb24ifTo8L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBzZWxlY3Rpb24gb2YgaW52b2x2ZWQgYWdlbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciBpbnZvbHZpZXJ0ZW4gQWdlbnRzIGFuemVpZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSW5mb3JtQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHNlbGVjdGlvbiBvZiBhZ2VudHMgdG8gaW5mb3JtIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXVzd2FobCBkZXIgenUgaW5mb3JtaWVyZW5kZW4gQWdlbnRzIGFuemVpZ2VuIChhbGxlIEFnZW50ZW4gbWl0ICJub3RpeiIgUmVjaHRlbiBhbSBUaWNrZXQvUXVldWUpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZVR5cGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlZvcmVpbmdlc3RlbGx0ZXIgTm90aXp0eXAuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TcGVjaWZ5IHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcywgdGhhdCB5b3Ugd2FudCB0byB1c2UgaW4geW91ciBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga/ZubmVuIGRpZSB2ZXJzY2hpZWRlbmVuIE5vdGl6LVR5cGVuIGZlc3RnZWxlZ3Qgd2VyZGVuLCBkaWUgaW5uZXJoYWxiIGRlcyBTeXN0ZW1zIHZlcndlbmRldCB3ZXJkZW4gc29sbGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHByaW9yaXR5IG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk32Z2xpY2hrZWl0IGRlciBBdXN3YWhsIGb8ciBkaWUgUHJpb3JpdOR0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHlEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBwcmlvcml0eSBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZhdWx0IEF1c3dhaGwgZGVyIFByaW9yaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgdGl0bGUgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5nYWJlbfZnbGljaGtlaXQgZvxyIFRpdGxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjVGlja2V0RnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biB0aWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgVGlja2V0LUZyZWktVGV4dC1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydCwgMiA9IEFrdGl2aWVydCB1bmQgUGZsaWNodGZlbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRGcmVlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRpbWUgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBUaWNrZXQtRnJlaS1UaW1lLUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LCAyID0gQWt0aXZpZXJ0IHVuZCBQZmxpY2h0ZmVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZUZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gYXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+R2V6ZWlndGUgQXJ0aWtlbC1GcmVpLVRleHQtRmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNIaXN0b3J5VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhpc3RvcnkgdHlwZSBmb3IgdGhpcyBhY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpc3RvcmllbnR5cCBm/HIgZGllc2UgQWt0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkFkZE5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSGlzdG9yeUNvbW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IaXN0b3J5IGNvbW1lbnQgZm9yIHRoaXMgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaXN0b3JpZW5rb21tZW50YXIgZvxyIGRpZXNlIEFrdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4lJU5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGRlY2lkZSBpZiB0aGUgc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCBpdHNtIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlIHN0dWZmLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBTaWUgZmVzdGxlZ2VuLCBvYiBkYXMgU3RhdGlzdGlrLU1vZHVsIGF1Y2ggU3RhdGlzdGlrZW4g/GJlciBJVFNNLVRpY2tldC1FcnN0bPZzdW5nc3JhdGUgRGluZ2UgZ2VuZXJpZXJlbiBkYXJmLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVjaWRlIGlmIHRoZSBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGl0c20gdGlja2V0IHNvbHV0aW9uIGF2ZXJhZ2Ugc3R1ZmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga/ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBTdGF0aXN0aWtlbiD8YmVyIElUU00tVGlja2V0LUz2c3VuZ3N6ZWl0LUR1cmNoc2NuaXR0IERpbmdlIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2U8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpY2tldElUU01UaWNrZXQueG1sLHYgMS4xNCAyMDEwLzAzLzAxIDEzOjAyOjQ2IHViIEV4cCAkPC9DVlM+CiAgICA8Q1ZTPiRPbGRJZDogVGlja2V0LnhtbCx2IDEuMjcwLjIuOSAyMDEwLzAyLzI2IDExOjUxOjE2IG1hcnRpbiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkLCB5b3UgY2FuIGRlZmluZSB0aWNrZXQgdHlwZXMgZm9yIHRpY2tldHMgKGUuIGcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGFzIFRpY2tldC1UeXAgRmVhdHVyZSBha3RpdmllcnQgaXN0LCBr9m5uZW4gVGlja2V0IFR5cGVuIHBybyBUaWNrZXQgZ2VzZXR6dCB3ZXJkZW4gKHouIEIuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTEzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxMyBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVNjaGz8c3NlbEZlbGRlcyAxMyBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyaXRpY2FsaXR5SUQiPkNyaXRpY2FsaXR5SUQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGV4dDEzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDEzIGZvciB0aWNrZXRzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxMyBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+RE8gTk9UIEFDVElWQVRFIFRpY2tldEZyZWVUZXh0MTMuIEdFTkVSQUwgQ0FUQUxPRyBJUyBVU0VELjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVLZXkxNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTQgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlTY2hs/HNzZWxGZWxkZXMgMTQgZvxyIFRpY2tldHMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBUaWNrZXRhdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0SUQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGV4dDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDE0IGZvciB0aWNrZXRzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+RE8gTk9UIEFDVElWQVRFIFRpY2tldEZyZWVUZXh0MTQuIEdFTkVSQUwgQ0FUQUxPRyBJUyBVU0VELjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTQ6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVLZXkxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTUgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlTY2hs/HNzZWxGZWxkZXMgMTUgZvxyIFRpY2tldHMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBUaWNrZXRhdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXZpZXcgUmVxdWlyZWQiPlJldmlldyBSZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTUgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE1IGb8ciBUaWNrZXRzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgVGlja2V0YXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTUgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ObzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVLZXkxNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTYgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlTY2hs/HNzZWxGZWxkZXMgMTYgZvxyIFRpY2tldHMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBUaWNrZXRhdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWNpc2lvbiBSZXN1bHQiPkRlY2lzaW9uIFJlc3VsdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTYgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE2IGb8ciBUaWNrZXRzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgVGlja2V0YXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGVuZGluZyI+UGVuZGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlLWFwcHJvdmVkIj5QcmUtYXBwcm92ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFwcHJvdmVkIj5BcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9zdHBvbmVkIj5Qb3N0cG9uZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlamVjdGVkIj5SZWplY3RlZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5QZW5kaW5nPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVLZXkzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBrZXkgb2YgVGlja2V0RnJlZVRpbWUgZmllbGQgMy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgU2NobHVlc3NlbHMgdm9uIFRpY2tldEZyZWVUaW1lIEZlbGQgMy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+UmVwYWlyIFN0YXJ0IFRpbWU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZVBlcmlvZDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIHBlcmlvZCwgd2hpY2ggY2FuIHNlbGVjdGVkIGluIFRpY2tldEZyZWVUaW1lIGZpZWxkIDMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIFplaXRzcGFubmUsIGRpZSBpbSBUaWNrZXRGcmVlVGltZSBGZWxkIDMgc2VsZWt0aWVydCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kUGFzdCI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZEZ1dHVyZSI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lS2V5NCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUga2V5IG9mIFRpY2tldEZyZWVUaW1lIGZpZWxkIDQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIFNjaGx1ZXNzZWxzIHZvbiBUaWNrZXRGcmVlVGltZSBGZWxkIDQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPlJlY292ZXJ5IFN0YXJ0IFRpbWU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZVBlcmlvZDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIHBlcmlvZCwgd2hpY2ggY2FuIHNlbGVjdGVkIGluIFRpY2tldEZyZWVUaW1lIGZpZWxkIDQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIFplaXRzcGFubmUsIGRpZSBpbSBUaWNrZXRGcmVlVGltZSBGZWxkIDQgc2VsZWt0aWVydCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kUGFzdCI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZEZ1dHVyZSI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lS2V5NSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUga2V5IG9mIFRpY2tldEZyZWVUaW1lIGZpZWxkIDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIFNjaGx1ZXNzZWxzIHZvbiBUaWNrZXRGcmVlVGltZSBGZWxkIDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkRlY2lzaW9uIERhdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZVBlcmlvZDUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIHBlcmlvZCwgd2hpY2ggY2FuIHNlbGVjdGVkIGluIFRpY2tldEZyZWVUaW1lIGZpZWxkIDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIFplaXRzcGFubmUsIGRpZSBpbSBUaWNrZXRGcmVlVGltZSBGZWxkIDUgc2VsZWt0aWVydCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kUGFzdCI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZEZ1dHVyZSI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lS2V5NiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUga2V5IG9mIFRpY2tldEZyZWVUaW1lIGZpZWxkIDYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIFNjaGx1ZXNzZWxzIHZvbiBUaWNrZXRGcmVlVGltZSBGZWxkIDYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkR1ZSBEYXRlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVEaWZmNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZGlmZmVyZW5jZSAoaW4gc2Vjb25kcykgb2YgdGhlIGRlZmF1bHR2YWx1ZSBpbiBUaWNrZXRGcmVlVGltZSBmaWVsZCA2LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBVbnRlcnNjaGllZHMgKGluIFNla3VuZGVuKSBkZXMgRGVmYXVsdHdlcnRzIHZvbiBUaWNrZXRGcmVlVGltZSBGZWxkIDYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPjI1OTIwMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lUGVyaW9kNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgcGVyaW9kLCB3aGljaCBjYW4gc2VsZWN0ZWQgaW4gVGlja2V0RnJlZVRpbWUgZmllbGQgNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgWmVpdHNwYW5uZSwgZGllIGltIFRpY2tldEZyZWVUaW1lIEZlbGQgNiBzZWxla3RpZXJ0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RQYXN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kRnV0dXJlIj45PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0RnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRUaWNrZXRGcmVlVGV4dCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50VGlja2V0RnJlZVRleHQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGlja2V0IEZyZWVUZXh0PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5GcmVlIEZpZWxkczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI1RpY2tldEZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGV4dCBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIFRpY2tldC1GcmVpLVRleHQtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Q2xvc2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UjIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBUaWNrZXQtRnJlaS1UZXh0LUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LCAyID0gQWt0aXZpZXJ0IHVuZCBQZmxpY2h0ZmVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0NvbXBvc2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEVtYWlsIyMjVGlja2V0RnJlZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biB0aWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgVGlja2V0LUZyZWktVGltZS1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydCwgMiA9IEFrdGl2aWVydCB1bmQgUGZsaWNodGZlbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdFbWFpbE5ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZSMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGltZSBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIFRpY2tldC1GcmVpLVRpbWUtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSB0aWNrZXQgdHlwZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFRpY2tldC1UeXAgZ2VzZXR6dCB3ZXJkZW4gc29sbCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXYgc2VpbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSBzZXJ2aWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgU2VydmljZSBnZXNldHp0IHdlcmRlbiBzb2xsIChUaWNrZXQ6OlNlcnZpY2UgbXVzcyBha3RpdiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRTZWFyY2gjIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRleHQgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+R2V6ZWlndGUgVGlja2V0LUZyZWktVGV4dC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlYXJjaCMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGltZSBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBUaWNrZXQtRnJlaS1UaW1lLUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3U2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzEwLUZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgZnJlZSB0ZXh0IGxpbmsgaW4gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGluayBm/HIgIkZyZWlmZWxkZXIiIGltIE1lbvwgZGVyIFRpY2tldGFuc2ljaHQgYW56ZWlnZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkZyZWUgRmllbGRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+Q2hhbmdlIHRoZSB0aWNrZXQgZnJlZSBmaWVsZHMhPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50VGlja2V0RnJlZVRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldEZyZWVUZXh0JmFtcDtUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNVGlja2V0LnBtIC0gdGhlIGJ1bGdhcmlhbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1pbGVuIEtvdXRldgojIC0tCiMgJElkOiBiZ19JVFNNVGlja2V0LnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NTU6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ8rw4Ont4CDk4PLgJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfQ5fjl7ejlJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfO8e3u4uDt6OUnOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ8Tg8uAg5+Ag8OX44OLg7eUnOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ8Tu4eDi6CDw5fjl7ejlIOr67CDh6Ovl8uAnOwogICAgJExhbmctPnsnRGVjaXNpb24gUmVzdWx0J30gICAgICAgICAgICAgID0gJ9Dl5/Pr8uDyIO7yIPDl+OXt6OXy7ic7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnyOfo8eri4CDv8OXj6+Xm5ODt5Sc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAn7/Do6uv+9+XtIPEg7uH17uTt7iDw5fjl7ejlJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICfE7u/66+3o8uXr7eggSVRTTSDv7uvl8uAnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ8/w7uzl7eggSVRTTSDv7uvl8uDy4CDt4CDh6Ovl8uAnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ8Lw5ezlIO3gIPHy4PDy6PDg7eUg7eAg8OXs7u3y4Cc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnwvDl7OUg7eAg8fLg8PLo8ODt5SDt4CDi+ufx8uDt7uL/4uDt5fLuJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNVGlja2V0LnBtIC0gdGhlIGNhdGFsYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggU2lzdGVtZXMgT1RJQyAoaWJzYWx1dCkgLSBBbnRvbmlvIExpbmRlCiMgLS0KIyAkSWQ6IGN0X0lUU01UaWNrZXQucG0sdiAxLjQgMjAwOS8wNS8xOCAwOTo1NTo1NCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBkZSB2ZW5jaW1lbnQnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0RlY2lzafMnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Jh8yc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRGF0YSBkZSBkZWNpc2nzJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdBZmVnaXIgZGVjaXNp8yBhbCB0aXF1ZXQnOwogICAgJExhbmctPnsnRGVjaXNpb24gUmVzdWx0J30gICAgICAgICAgICAgID0gJ1Jlc3VsdGF0IGRlIGxhIGRlY2lzafMnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JldmlzafMgcmVxdWVyaWRhJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdUYW5jYXQgYW1iIHNvbHVjafMgdGVtcG9yYWwnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ0NhbXBzIElUU00gYWRkaWNpb25hbHMnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0NhdmlhciBDYW1wcyBJVFNNIGFkZGljaW9uYWxzIGRlbCB0aXF1ZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ1RlbXBzIGRcJ2luaWNpIGRlIGxhIHJlcGFyYWNp8yc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnVGVtcHMgZFwnaW5pY2kgZGUgbGEgcmVjdXBlcmFjafMnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNVGlja2V0LnBtIC0gdGhlIGN6ZWNoIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgQ29weXJpZ2h0IChDKSAyMDEwIE8yQlMuY29tLCBzIHIuby4gSmFrdWIgSGFudXMKIyAtLQojICRJZDogY3pfSVRTTVRpY2tldC5wbSx2IDEuNyAyMDEwLzAyLzIyIDEyOjIxOjE1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBEYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdOZWp6YXq57SBUZXJt7W4nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ9hluWVu7Sc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUPjt6GluYSc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRGF0dW0g2GW5ZW7tJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdQ+GlkYXQg+GW5ZW7tIGsgdGlrZXR1JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdW/XNsZWRlayDYZbllbu0nOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1Z5vmFkdWplIFD4ZWhsZWQnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ3V6YXb4ZW5vIGRv6GFzbv1tIPhluWVu7W0nOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ0RvcGzya2924SBJVFNNIHBvbGUnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1pt7G5hIElUU00gcG9s7SB2IHRpa2V0dSc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnyGFzIHphaOFqZW7tIG9wcmF2eSc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnyGFzIHphaOFqZW7tIG9ibm92ZW7tJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdabezydGUgSVRNUyBwb2xlISc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnRG9wbPJ0ZSD4Zbllbu0hJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNVGlja2V0LnBtIC0gcHJvdmlkZXMgZGEgKERhbmlzaCkgbGFuZ3VhZ2UgdHJhbnNsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRhX0lUU01UaWNrZXQucG0sdiAxLjEgMjAxMC8wNi8yNSAwOTowMjozNyBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkYV9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRm9yZmFsZHNkYXRvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdCZXNsdXRuaW5nJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWdydW5kZWxzZSc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdUaWxm+GogYmVzbHV0bmluZyB0aWwgc2FnJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdCZXNsdXRuaW5nc3Jlc3VsdGF0JzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdBbm1lbGRlbHNlIGty5nZlcyc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAnTHVra2V0IG1lZCB3b3JrYXJvdW5kJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdZZGVybGlnZSBJVFNNIGZlbHRlcic7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnUmV0IHNhZ2VucyBJVFNNIGZlbHRlcic7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnU3RhcnR0aWQgZm9yIHJlcGVyYXRpb24nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ1N0YXJ0dGlkIGZvciBnZW5ldGFibGVyaW5nJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdSZXQgSVRTTSBmZWx0ZXIhJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdUaWxm+GogZW4gYmVzbHV0bmluZyEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNVGlja2V0LnBtIC0gdGhlIGdlcm1hbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9JVFNNVGlja2V0LnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTU6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0bkbGxpZ2tlaXRzZGF0dW0nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVncvxuZHVuZyc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRW50c2NoZWlkdW5nc2RhdHVtJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdFbnRzY2hlaWR1bmcgYW4gVGlja2V0IGjkbmdlbic7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnRW50c2NoZWlkdW5nJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdOYWNoYmVhcmJlaXR1bmcgZXJmb3JkZXJsaWNoJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdwcm92aXNvcmlzY2ggZ2VzY2hsb3NzZW4nOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ1p1c+R0emxpY2hlIElUU00gRmVsZGVyJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfEbmRlcm4gZGVyIElUU00gRmVsZGVyIGRlcyBUaWNrZXRzJzsKICAgICRMYW5nLT57J1JlcGFpciBTdGFydCBUaW1lJ30gICAgICAgICAgICA9ICdSZXBhcmF0dXIgU3RhcnR6ZWl0JzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICdXaWVkZXJoZXJzdGVsbHVuZyBTdGFydHplaXQnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ8RuZGVybiBkZXIgSVRTTS1GZWxkZXIhJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdIaW56dWb8Z2VuIGVpbmVyIEVudHNjaGVpZHVuZyEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNVGlja2V0LnBtIC0gdGhlIHNwYW5pc2ggdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggQXF1aWxlcyBDb2hlbgojIC0tCiMgJElkOiBlc19JVFNNVGlja2V0LnBtLHYgMS42IDIwMDkvMDUvMTggMDk6NTU6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0ZlY2hhIGRlIFZlbmNpbWllbnRvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdEZXNpY2nzbic7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnTW90aXZvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdGZWNoYSBkZSBEZXNpY2nzbic7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnQfFhZGlyIGRlc2ljafNuIGFsIHRpY2tldCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnUmVzdWx0YWRvIGRlIERlc2ljafNuJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdSZXZpc2nzbiByZXF1ZXJpZGEnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ0NlcnJhZG8gY29uIHNvbHVjafNuIHByb3Zpc2lvbmFsJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdDYW1wb3MgSVRTTSBhZGljaW9uYWxlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnTW9kaWZpY2FyIGNhbXBvcyBJVFNNIGRlbCB0aWNrZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ0ZlY2hhIGluaWNpYWwgZGUgcmVwYXJhY2nzbic7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnRmVjaGEgaW5pY2lhbCBkZSByZWN1cGVyYWNp824nOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNVGlja2V0LnBtIC0gdGhlIHBlcnNpYW4gKGZhcnNpKSB0cmFuc2xhdGlvbiBvZiBmYV9JVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IEFmc2hhciBNb2hlYmJpIDxhZnNoYXIubW9oZWJiaSBhdCBnbWFpbC5jb20+CiMgLS0KIyAkSWQ6IGZhX0lUU01UaWNrZXQucG0sdiAxLjEgMjAwOS8wNy8yMCAxMDozNjowOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYp9mG2KzYp9mFJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfYqti12YXbjNmFJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9mE24zZhCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYqti12YXbjNmFJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfYp9mE2LXYp9mCINuM2qkg2KrYtdmF24zZhSDYqNmHINiv2LHYrtmI2KfYs9iqJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICfZhtiq24zYrNmHINiq2LXZhduM2YUnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ9mG24zYp9iyINio2Ycg2KjYp9iy2KjbjNmG24wg2K/Yp9ix2K8nOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ9mF2YjZgtiq2Kcg2KjYs9iq2Ycg2LTYryc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAn2YHbjNmE2K/Zh9in24wg2KfYttin2YHZhyBJVFNNJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfYqti624zbjNixINmB24zZhNiv2YfYp9uMIElUU00g2K/Ysdiu2YjYp9iz2KonOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ9iy2YXYp9mGINi02LHZiNi5INiq2LnZhduM2LEnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ9iy2YXYp9mGINi02LHZiNi5INio2YfYqNmI2K8nOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ9mB24zZhNiv2YfYp9uMIElUU00g2LHYpyDYqti624zbjNixINiv2YfbjNivISc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAn24zaqSDYqti12YXbjNmFINin2LbYp9mB2Ycg2qnZhtuM2K8hJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNVGlja2V0LnBtIC0gdGhlIGZyZW5jaCB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT2xpdmllciBTYWxsb3UgPG9saXZpZXIuc2FsbG91IGF0IGlyaXNhLmZyPgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZnJfSVRTTVRpY2tldC5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjMyOjUyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBEYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdFbmdhZ2VuZW50IGRlIERhdGUnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0TpY2lzaW9uJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdSYWlzb24nOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ0RhdGUgZGUgZOljaXNpb24nOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ0Fqb3V0ZXIgdW5lIGTpY2lzaW9uIGF1IHRpY2tldCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnUulzdWx0YXQgZGUgbGEgROljaXNpb24nOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JldnVlIHJlcXVpc2UnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ0Zlcm3pIGF2ZWMgY29udG91cm5lbWVudCc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnQ2hhbXBzIElUU00gYWRkaXRpb25lbHMnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWVyIGxlcyBjaGFtcHMgSVRTTSBkdSB0aWNrZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ0RhdGUgZGUgZOlidXQgZGUgculwYXJhdGlvbic7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnRGF0ZSBkZSBk6WJ1dCBkZSByZXRvdXIg4CBsYSBub3JtYWxlJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdNb2RpZmlleiBsZXMgY2hhbXBzIElUU00hJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdBam91dGV6IHVuZSBk6WNpc2lvbiEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNVGlja2V0LnBtIC0gdGhlIGl0YWxpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogaXRfSVRTTVRpY2tldC5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjU1OjA5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBEYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIFNjYWRlbnphJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdSaXNvbHV6aW9uZSc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnTW90aXZvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIFJpc29sdXppb25lJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdBZ2dpdW5naSB1bmEgUmlzb2x1emlvbmUgYWwgVGlja2V0JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSaXN1bHRhdG8gZGVsbGEgUmlzb2x1emlvbmUnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JpY2hpZXN0YSBSZXZpc2lvbmUnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdDYW1waSBJVFNNIGFnZ2l1bnRpdmknOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWNhIGNhbXBpIElUU00gZGVsIHRpY2tldCc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnRGF0YSBpbml6aWFsZSBkaSByaXBhcmF6aW9uZSc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnRGF0YSBpbml6aWFsZSBkaSByZWN1cGVybyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnQ2FtYmlhIGkgY2FtcGkgSVRTTSEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0FnZ2l1bmdpIHVuYSByaXNvbHV6aW9uZSEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNVGlja2V0LnBtIC0gdGhlIER1dGNoIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGllbCBCZWlqZW4gPG1pY2hpZWwgJ2F0JyBiZWVmcmVlaXQubmw+CiMgLS0KIyAkSWQ6IG5sX0lUU01UaWNrZXQucG0sdiAxLjEgMjAwOS8wNy8yMCAxNDowMDo0OSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnVmVydmFsZGF0dW0nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0Jlc2xpc3NpbmcnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1JlZGVuJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdCZXNsaXNzaW5nc2RhdHVtJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdLb3BwZWwgYmVzbGlzc2luZyBhYW4gdGlja2V0JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSZXN1bHRhYXQgYmVzbGlzc2luZyc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnUmV2aWV3IGJlbm9kaWdkJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdnZXNsb3RlbiBtZXQgd29ya2Fyb3VuZCc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnRXh0cmEgSVRTTSB2ZWxkZW4nOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ZlcmFuZGVyZW4gdmFuIElUU00gdmVsZGVuIHZhbiB0aWNrZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ0JlZ2ludGlqZCByZXBhcmF0aWUnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ0JlZ2ludGlqZCBoZXJzdGVsJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdWZXJhbmRlcmVuIHZhbiBJVFNNIHZlbGRlbiEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0Jlc2xpc3NpbmcgdG9ldm9lZ2VuISc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNVGlja2V0LnBtIC0gdGhlIHBvbGlzaCB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBNYWNpZWogTG9zemFqYwojIC0tCiMgJElkOiBwbF9JVFNNVGlja2V0LnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NTU6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0N6YXMgcHJ6eWJ5Y2lhJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdEZWN5emphJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3fzZCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRGF0YSBkZWN5emppJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdEb2RhaiBkZWN5emplIGRvIGJpbGV0dSc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnUmV6dWx0YXQgZGVjeXpqaSc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdSb3p3abF6YW5lIHogb2JlarZjaWVtJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdEb2RhdGtvd2UgcG9sYSBJVFNNJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdabWll8SBwb2xhIElUU00gZGxhIGJpbGV0dSc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnQ3phcyByb3pwb2N66mNpYSBuYXByYXd5JzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICdDemFzIHJvenBvY3rqY2lhIG9kenlza2l3YW5pYSc7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNVGlja2V0LnBtIC0gdGhlIEJyYXppbGlhbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAxMCBDcmlzdGlhbm8gS29ybmT2cmZlciwgaHR0cDovL3d3dy5kb3JmZXIuY29tLmJyLwojIC0tCiMgJElkOiBwdF9CUl9JVFNNVGlja2V0LnBtLHYgMS4xIDIwMTAvMDMvMDEgMDk6NTM6MTQgbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGEgVmVuY2ltZW50byc7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnRGVjaXPjbyc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmF6428nOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ0RhdGEgZGUgRGVjaXPjbyc7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnQWRpY2lvbmFyIERlY2lz428g4CBTb2xpY2l0Yefjbyc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnRGVjaXPjbyBSZXN1bHRhbnRlJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdSZXZpc+NvIFJlcXVpc2l0YWRhJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdmZWNoYWRhIGNvbSBzb2x15+NvIGRlIGNvbnRvcm5vJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdDYW1wb3MgYWRpY2lvbmFpcyBJVFNNJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdNdWRhciBvcyBjYW1wb3MgSVRTTSBkYSBzb2xpY2l0Yefjbyc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnSG9yYSBJbmljaWFsIGRvIFJlcGFybyc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnSG9yYSBJbmljaWFsIGRhIFJlY3VwZXJh5+NvJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdNdWRhciBvcyBjYW1wb3MgSVRTTSEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0FkaWNpb25hciB1bWEgZGVjaXPjbyEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNVGlja2V0LnBtIC0gdGhlIHJ1c3NpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggRWdvciBUc2lsZW5rbyA8Ymc4cyBhdCBzeW1saW5rLnJ1PgojIC0tCiMgJElkOiBydV9JVFNNVGlja2V0LnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTU6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIERhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ8Tg8uAg6PHv7uvt5e3o/yc7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAn0OX45e3o5Sc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Do9+jt4Cc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnxODy4CDw5fjl7ej/JzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfC++3l8fLoIPDl+OXt6OUg7+4g5+D/4urlJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICfQ5efz6/zy4PIg8OX45e3o/yc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnzeXu4fXu5OjsIO/w7vHs7vLwJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfn4Orw+/LuIPEg7uH17uTt++wg8OX45e3o5ewnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ8Tu7+7r7ejy5ev87fvlIElUU00g7+7r/yc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnyOfs5e3o8vwgSVRTTSDv7uv/IOfg/+Lq6Cc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnxODy4CDt4Pfg6+Ag8ODh7vInOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ8Tg8uAg4u7x8fLg7e7i6+Xt6P8g8eXw4ujx4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNVGlja2V0LnBtIC0gdGhlIENoaW5lc2Ugc2ltcGxlIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHpoX0NOX0lUU01UaWNrZXQucG0sdiAxLjIgMjAwOS8xMC8xNCAyMDo0NjoxOSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnvdjWucjVxtonOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ772tqgnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Dt08knOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ772tqjI1cbaJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfU9rzTvva2qLW9IFRpY2tldCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnvva2qL3hufsnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ8nzsunJ6sfrJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfM5rT6t723qLb4udix1Sc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAntu7N4rXEIElUU00g0/InOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ86quMMgVGlja2V0ILj8uMQgSVRTTSDT8ic7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAn0N64tL+qyrzKsbzkJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICe71ri01MvX98qxvOQnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ7j8uMQgSVRTTSDT8iEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ9T2vNPSu7j2vvbS6SEnOwojIEFkZCBieSBOZXZlcgogICAgJExhbmctPnsnQXBwcm92ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ8X617wnOwogICAgJExhbmctPnsnUGVuZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ7T9tqgnOwogICAgJExhbmctPnsnUG9zdHBvbmVkJ30gICAgICAgICAgICAgICAgICAgID0gJ83Gs9knOwogICAgJExhbmctPnsnUHJlLWFwcHJvdmVkJ30gICAgICAgICAgICAgICAgID0gJ9Skz8i6y9e8JzsKICAgICRMYW5nLT57J1JlamVjdGVkJ30gICAgICAgICAgICAgICAgICAgICA9ICe+3L74JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0gLSBhZGRpdGlvbmFsIGl0c20gZmllbGRzIGZvciB0aWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0sdiAxLjkgMjAwOS8wOS8zMCAxNzo1MjoyOSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5wbSx2IDEuNTkuMi4xIDIwMDkvMDkvMjMgMDk6NTE6NTggbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDsKIyAtLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRpY2tldElEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSwKICAgICAgICApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ0F0dGFjaG1lbnREZWxldGUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICBteSBATm90aWZ5VXNlcklEcyA9ICggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0gKTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gXEBOb3RpZnlVc2VySURzLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBcQE5vdGlmeURvbmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNraXAgZGVsZXRlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gPX4gL15pbmxpbmUvCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJEF0dGFjaG1lbnQtPntDb250ZW50SUR9LzsKCiAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgY29uZmlndXJlZCBkZWZhdWx0IHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtCb2R5fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2g7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFN0YXRlSUQ7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBSZXN1bHQgPT4gJ0hBU0gnICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawojIC0tLQojIElUU00KIyAtLS0KIyAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRGcmVlVGV4dCcsIERhdGEgPT4gXCVQYXJhbSApOwogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCcsIERhdGEgPT4gXCVQYXJhbSk7CiMgLS0tCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Q2xvc2UucG0gLSBjbG9zZSBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRDbG9zZS5wbSx2IDEuOSAyMDA5LzA5LzMwIDE3OjUyOjI5IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldENsb3NlLnBtLHYgMS42OS4yLjEgMjAwOS8wOS8yMyAwOTo1MTo1OCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldENsb3NlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGdldCBpbmZvcm0gdXNlciBsaXN0CiAgICBteSBASW5mb3JtVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwogICAgJFNlbGYtPntJbmZvcm1Vc2VySUR9ID0gXEBJbmZvcm1Vc2VySUQ7CgogICAgIyBnZXQgaW52b2x2ZWQgdXNlciBsaXN0CiAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKICAgICRTZWxmLT57SW52b2x2ZWRVc2VySUR9ID0gXEBJbnZvbHZlZFVzZXJJRDsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFkZGl0aW9uYWwgcGFyYW1zCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gPSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRGcmVlVGltZU51bWJlciApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDA7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICAgID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHRpbWVkYXRhCiAgICAgICAgbXkgJFRpbWVEYXRhQ29tcGxldGUgPSAxOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBuZXh0IFRZUEUgaWYgZGVmaW5lZCAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CgogICAgICAgICAgICAkVGltZURhdGFDb21wbGV0ZSA9IDA7CiAgICAgICAgICAgIGxhc3QgVFlQRTsKICAgICAgICB9CgogICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVIgaWYgJFRpbWVEYXRhQ29tcGxldGU7CgogICAgICAgIGlmICggISRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApIHsKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZywKICAgICAgICApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydCb2R5IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnQXR0YWNobWVudERlbGV0ZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHRpdGxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17VGl0bGV9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0eXBlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHNlcnZpY2UKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTTEFJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBvd25lcgogICAgICAgIG15IEBOb3RpZnlEb25lOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3T3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyByZXNwb25zaWJsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgcmVzcG9uc2libGUgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIG15IEBOb3RpZnlVc2VySURzID0gKCBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSApOwogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFxATm90aWZ5RG9uZSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICMgc2tpcCBkZWxldGVkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgIG5leHQgaWYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRBdHRhY2htZW50LT57Q29udGVudElEfSA9fiAvXmlubGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0JvZHl9ICF+IC8kQXR0YWNobWVudC0+e0NvbnRlbnRJRH0vOwoKICAgICAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBsYXN0IHNjcmVlbiBvdmVydmlldyBvbiBjbG9zZWQgdGlja2V0cwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSBAVGlja2V0RnJlZVRleHRDb25maWcgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkQ29uZmlnS2V5ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAgJFRpY2tldHtRdWV1ZUlEfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ0tleSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvbmZpZ1ZhbHVlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdWYWx1ZSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCBjb25maWd1cmVkIGRlZmF1bHQgdmFycwogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0JvZHl9ICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaDsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBuZXh0IGlmICEkU3RhdGVJRDsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFJlc3VsdCA9PiAnSEFTSCcgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRDbG9zZScsIERhdGEgPT4gXCVQYXJhbSApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RGVjaXNpb24ucG0gLSB0byBhZGQgbm90ZXMgKGRlY2lzaW9uKSB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXREZWNpc2lvbi5wbSx2IDEuOSAyMDA5LzA5LzMwIDE3OjUyOjI5IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUucG0sdiAxLjcxLjIuMSAyMDA5LzA5LzIzIDA5OjUxOjU4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiNwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXROb3RlOwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXREZWNpc2lvbjsKIyAtLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRpY2tldElEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSwKICAgICAgICApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ0F0dGFjaG1lbnREZWxldGUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICBteSBATm90aWZ5VXNlcklEcyA9ICggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0gKTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gXEBOb3RpZnlVc2VySURzLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBcQE5vdGlmeURvbmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNraXAgZGVsZXRlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gPX4gL15pbmxpbmUvCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJEF0dGFjaG1lbnQtPntDb250ZW50SUR9LzsKCiAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgY29uZmlndXJlZCBkZWZhdWx0IHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtCb2R5fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2g7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFN0YXRlSUQ7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBSZXN1bHQgPT4gJ0hBU0gnICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawojIC0tLQojIElUU00KIyAtLS0KIyAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXROb3RlJywgRGF0YSA9PiBcJVBhcmFtICk7CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXREZWNpc2lvbicsIERhdGEgPT4gXCVQYXJhbSApOwojIC0tLQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0gLSB0byBjb21wb3NlIGluaXRpYWwgZW1haWwgdG8gY3VzdG9tZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0RW1haWwucG0sdiAxLjE0IDIwMTAvMDEvMjAgMTM6NTM6NTAgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0RW1haWwucG0sdiAxLjk5LjIuMyAyMDEwLzAxLzA3IDIyOjI2OjAyIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0RW1haWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlsczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIE1haWw6OkFkZHJlc3M7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE0ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbC8gKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgZm9yICgKICAgICAgICBxdyhBdHRhY2htZW50VXBsb2FkCiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgVG8gQ2MgQmNjIFRpbWVVbml0cyBQcmlvcml0eUlEIFN1YmplY3QgQm9keQogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgT3duZXJBbGwgUmVzcG9uc2libGVBbGwKICAgICAgICBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlECiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1RpY2tldEZyZWVUZXh0MTQnKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgIGlmICggICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnCiAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgbXkgJVNlcnZpY2U7CiAgICBteSAkSW1wYWN0TGlzdCA9IHt9OwogICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CiAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0ltcGFjdElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0MTQ6OkRlZmF1bHRTZWxlY3Rpb24nKTsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0IGlkCiAgICAgICAgICAgIG15ICVJbXBhY3RMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW1wYWN0TGlzdH07CiAgICAgICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICA9ICRJbXBhY3RMaXN0UmV2ZXJzZXskRGVmYXVsdFNlbGVjdGlvbn07CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gKSB7CgogICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgIlRpY2tldEZyZWVUaW1lIiAuICRfIC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICJUaWNrZXRGcmVlVGltZSIgLiAkXyAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdPcHRpb25hbCcgfQogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkXyApIHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRfICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwoKICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpY2tldCBpZCEKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSB8fCAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSApIHsKCiAgICAgICAgICAgICMgbmF2aWdhdGlvbiBiYXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAnVGlja2V0ICIlcyIgY3JlYXRlZCEiLCAiJyAuICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0nIC4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzcGxpdCBhcnRpY2xlIGlmIGdpdmVuCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9ucwogICAgICAgICAgICBteSAlVGlja2V0RnJlZURlZmF1bHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlRGVmYXVsdHsgJ1RpY2tldEZyZWVLZXknIC4gJF8gfSA9ICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVLZXknIC4gJF8gfQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZUtleScgLiAkXyAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZURlZmF1bHR7ICdUaWNrZXRGcmVlVGV4dCcgLiAkXyB9ID0gJEdldFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJF8gfQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAlVGlja2V0RnJlZURlZmF1bHQsCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTAogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoICVQYXJhbSwgVGlja2V0ID0+IFwlR2V0UGFyYW0sICk7CgogICAgICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBkZWZhdWx0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlRGVmYXVsdCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyAnQXJ0aWNsZUZyZWVLZXknIC4gJF8gfSA9ICRHZXRQYXJhbXsgJ0FydGljbGVGcmVlS2V5JyAuICRfIH0KICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ0FydGljbGVGcmVlS2V5JyAuICRfIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZURlZmF1bHR7ICdBcnRpY2xlRnJlZVRleHQnIC4gJF8gfSA9ICRHZXRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dCcgLiAkXyB9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdBcnRpY2xlRnJlZVRleHQnIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4geyAlR2V0UGFyYW0sICVBcnRpY2xlRnJlZURlZmF1bHQsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICAgICAnSEFTSCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUpvYnMKICAgICAgICAgICAgICAgICAgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAgICAgICAgIGZvciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEgKSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEgKSwKICAgICAgICAgICAgICAgIFR5cGVzICAgICAgPT4gJFNlbGYtPl9HZXRUeXBlcyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFVzZXJzICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXRVc2VycyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9ICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICAgICAgRnJvbUxpc3QgPT4gJFNlbGYtPl9HZXRUb3MoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICAgICAgVG8gICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgIEJvZHkgICAgID0+ICRCb2R5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0IGFuZCBhcnRpY2xlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewogICAgICAgIG15ICVFcnJvciAgICAgICA9ICgpOwogICAgICAgIG15ICROZXh0U3RhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApIHx8ICcnOwogICAgICAgIG15ICVTdGF0ZURhdGEgICA9ICgpOwogICAgICAgIGlmICgkTmV4dFN0YXRlSUQpIHsKICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICROZXh0U3RhdGVJRCwgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSAgICAgICAgPSAkU3RhdGVEYXRhe05hbWV9OwogICAgICAgIG15ICROZXdSZXNwb25zaWJsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3UmVzcG9uc2libGVJRCcgKSB8fCAnJzsKICAgICAgICBteSAkTmV3VXNlcklEICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJEZyb20gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAlUXVldWUgICAgID0gKCk7CiAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICcnOwogICAgICAgIGlmICgkTmV3UXVldWVJRCkgewogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPl9HZXRTaWduYXR1cmUoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKTsKICAgICAgICAgICAgJVF1ZXVlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKTsKICAgICAgICB9CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEV4cGFuZEN1c3RvbWVyTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0V4cGFuZEN1c3RvbWVyTmFtZScgKQogICAgICAgICAgICB8fCAwOwogICAgICAgICRHZXRQYXJhbXtGcm9tfSAgICAgICAgICAgICAgID0gJFF1ZXVle0VtYWlsfTsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRJdGVtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJF8iICkgfHwgMDsKICAgICAgICAgICAgaWYgKCAkXyA9PSAxICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkXyA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9eydUaWNrZXRGcmVlVGV4dCd9eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICdpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSwgKTsKCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBFeHBhbmQgQ3VzdG9tZXIgTmFtZQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gKCk7CiAgICAgICAgaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDEgKSB7CgogICAgICAgICAgICAjIHNlYXJjaCBjdXN0b21lcgogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICgpOwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yICgga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9Kys7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9ICAgICA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7IkV4cGFuZEN1c3RvbWVyTmFtZSJ9ID0gMTsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGUgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzLCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCggS2V5ID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywgVmFsdWUgPT4gMCApOwogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAnJzsKICAgICAgICAgICAgICAgICRQYXJhbXsiVG9PcHRpb25zIn0gPSBcJUN1c3RvbWVyVXNlckxpc3Q7CgogICAgICAgICAgICAgICAgIyBjbGVhciB0byBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEVycm9yeyJFeHBhbmRDdXN0b21lck5hbWUifSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kQ3VzdG9tZXJOYW1lIn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhIG5ldyBkZXN0aW5hdGlvbiBxdWV1ZSBpcyBzZWxlY3RlZAogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAzICkgewogICAgICAgICAgICAkRXJyb3J7Tm9TdWJtaXR9ID0gMTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRTZWxlY3RlZEN1c3RvbWVyVXNlcjsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YSA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgaWYgKCRDdXN0b21lclVzZXIpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBpZiAhJEdldFBhcmFteyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IiRMaW5lIGludmFsaWQifSAuPSAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IiRMaW5lIGludmFsaWQifQogICAgICAgICAgICAgICAgICAgICAgICAuPSAiQ2FuJ3Qgc2VuZCBlbWFpbCB0aWNrZXQgdG8gIgogICAgICAgICAgICAgICAgICAgICAgICAuICRFbWFpbC0+YWRkcmVzcygpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiEgSXQncyBhIGxvY2FsIGFkZHJlc3MhIENyZWF0ZSBhIHBob25lIFRpY2tldCEiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtUb30gJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSAhPSAxICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydUbyBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAgKSB7CiAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGlmICggISROZXdRdWV1ZUlEICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydEZXN0aW5hdGlvbiBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGRhdGUgaXMgdmFsaWQKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIG15ICVBcnRpY2xlUGFyYW0gPSAoKTsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9LCApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgZm9yICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgIyB0aWNrZXQgcGFyYW1zCiAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtID0gKAogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+QXJ0aWNsZU9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhlYWRlcgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyAgID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2Vyc1NlbGVjdGVkID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyAgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgICAgPT4gJFNlbGYtPl9HZXRUb3MoKSwKICAgICAgICAgICAgICAgIEZyb21TZWxlY3RlZCA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFRvT3B0aW9ucyAgICA9PiAkUGFyYW17VG9PcHRpb25zfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte1N1YmplY3R9ICksCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvQXNjaWkoIFN0cmluZyA9PiAkU2lnbmF0dXJlLCApLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGlja2V0LCBkbyBkYiBpbnNlcnQKICAgICAgICBteSAkVGlja2V0SUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDE0LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoKCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmYgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSAuPSAiPGJyLz48YnIvPiIgLiAkU2lnbmF0dXJlOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnRzID0gKCk7CiAgICAgICAgICAgIFJFTU9WRUlOTElORToKICAgICAgICAgICAgZm9yIG15ICRUbXBBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgIG5leHQgUkVNT1ZFSU5MSU5FIGlmICRUbXBBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVG1wQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gPX4gL15pbmxpbmUvCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJFRtcEF0dGFjaG1lbnQtPntDb250ZW50SUR9LzsKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnRzLCBcJXskVG1wQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnRzID0gQE5ld0F0dGFjaG1lbnRzOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBlbWFpbAogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVTZW5kKAogICAgICAgICAgICBOb0FnZW50Tm90aWZ5ICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgQXR0YWNobWVudCAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgPT4gJ2VtYWlsLWV4dGVybmFsJywKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICA9PiAiJFF1ZXVle1JlYWxOYW1lfSA8JFF1ZXVle0VtYWlsfT4iLAogICAgICAgICAgICBUbyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICgkQXJ0aWNsZUlEKSB7CgogICAgICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIHNldCBvd25lciAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlbHNlIHNldCBvd25lciB0byBjdXJyZW50IGFnZW50IGJ1dCBkbyBub3QgbG9jayBpdAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgICAgIGlmICgkTmV3UmVzcG9uc2libGVJRCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdWxkIGkgc2V0IGFuIHVubG9jaz8KICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJE5leHRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBvcmFyaWx5IGxpbmtzCiAgICAgICAgICAgIG15ICRUZW1wTGlua0xpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJ1RlbXBvcmFyeScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVtcExpbmtMaXN0ICYmIHJlZiAkVGVtcExpbmtMaXN0IGVxICdIQVNIJyAmJiAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0T3JnICgga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0S2V5T3JnICgga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57VXNlckNyZWF0ZU5leHRNYXNrfSB8fCAnQWdlbnRUaWNrZXRFbWFpbCc7CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbiZTdWJhY3Rpb249Q3JlYXRlZCZUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKCiAgICAgICAgIyBnZXQgRnJvbSBiYXNlZCBvbiBzZWxlY3RlZCBxdWV1ZQogICAgICAgIG15ICRRdWV1ZUlEID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgICAgICBteSAlUXVldWUgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgfQogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQEV4dGVuZGVkRGF0YSA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvbmZpZ1ZhbHVlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdWYWx1ZSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9LCApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgZm9yICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPkRhdGEoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgU2lnbmF0dXJlIHRvIEFTQ0lJLCBpZiBSaWNoVGV4dCBpcyBvbgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKCBTdHJpbmcgPT4gJFNpZ25hdHVyZSwgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZ25hdHVyZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZVVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gU3ViYWN0aW9uISEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluJywKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlcyA9ICgpOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfR2V0VXNlcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15IEBVc2VySURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciAoIGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkXyApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHNob3cgdXNlcnMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgYWxsIHVzZXJzIHdobyBhcmUgcncgaW4gdGhlIHF1ZXVlIGdyb3VwCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncncnLAogICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skX30gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUHJpb3JpdGllcyA9ICgpOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUeXBlID0gKCk7CgogICAgIyBnZXQgdHlwZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2aWNlID0gKCk7CgogICAgIyBnZXQgc2VydmljZQogICAgaWYgKCAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgJiYgJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNMQSA9ICgpOwoKICAgICMgZ2V0IHNsYQogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3MgPSAoKTsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT57J1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJ30gKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eydUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbid9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvcyA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgIFRhYmxlID0+ICdzeXN0ZW1fYWRkcmVzcycsCiAgICAgICAgICAgICAgICBXaGF0ICA9PiAncXVldWVfaWQsIGlkJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBDbGFtcCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIGZvciBteSAkUXVldWVJRCAoIGtleXMgJVRvcyApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjaywgY2FuIHdlIGNyZWF0ZSBuZXcgdGlja2V0cyBpbiBxdWV1ZQogICAgICAgICAgICBuZXh0IGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwogICAgcmV0dXJuIFwlTmV3VG9zOwp9CgpzdWIgX0dldFNpZ25hdHVyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwogICAgbXkgJFNpZ25hdHVyZSAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgRGF0YSAgICA9PiBcJVBhcmFtLAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNpZ25hdHVyZTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgbXkgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJyk7CiAgICBpZiAoICRBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW5RdWVyeUxlbmd0aCAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNaW5RdWVyeUxlbmd0aH0gICAgICB8fCAyLAogICAgICAgICAgICAgICAgcXVlcnlEZWxheSAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57UXVlcnlEZWxheX0gICAgICAgICAgfHwgMC4xLAogICAgICAgICAgICAgICAgdHlwZUFoZWFkICAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57VHlwZUFoZWFkfSAgICAgICAgICAgfHwgJ2ZhbHNlJywKICAgICAgICAgICAgICAgIG1heFJlc3VsdHNEaXNwbGF5ZWQgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01heFJlc3VsdHNEaXNwbGF5ZWR9IHx8IDIwLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZTdGFydCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEN1c3RvbWVyQnV0dG9uJywKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17VXNlcnN9LT57Jyd9ID0gJy0nOwogICAgJFBhcmFteydPcHRpb25TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1VzZXJzfSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICApOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17J05leHRTdGF0ZXNTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgZnJvbSBzdHJpbmcKICAgIGlmICggJFBhcmFte1RvT3B0aW9uc30gJiYgJXsgJFBhcmFte1RvT3B0aW9uc30gfSApIHsKICAgICAgICAkUGFyYW17J0N1c3RvbWVyVXNlclN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RvT3B0aW9uc30sCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIE1heCAgPT4gNzAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgbXkgJU5ld1RvID0gKCk7CiAgICBpZiAoICRQYXJhbXtGcm9tTGlzdH0gKSB7CiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJF98fCRQYXJhbXtGcm9tTGlzdH0tPnskX30ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskX307CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAkUGFyYW17J0Zyb21TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtGcm9tU2VsZWN0ZWR9LAogICAgICAgICAgICBPbkNoYW5nZVN1Ym1pdCA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnU2lnbmF0dXJlJywKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnU2lnbktleUlEJywKICAgICAgICAgICAgICAgICAgICAnQ3J5cHRLZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgICAgICdUbycsCiAgICAgICAgICAgICAgICAgICAgJ0NjJywKICAgICAgICAgICAgICAgICAgICAnQmNjJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NpZ25LZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ0NyeXB0S2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICAgICAgJ1RvJywKICAgICAgICAgICAgICAgICAgICAnQ2MnLAogICAgICAgICAgICAgICAgICAgICdCY2MnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXsnRnJvbVN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdTaWduYXR1cmUnLAogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdTaWduS2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdDcnlwdEtleUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICAgICAgJ1RvJywKICAgICAgICAgICAgICAgICAgICAnQ2MnLAogICAgICAgICAgICAgICAgICAgICdCY2MnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnU2lnbktleUlEJywKICAgICAgICAgICAgICAgICAgICAnQ3J5cHRLZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgICAgICAnVG8nLAogICAgICAgICAgICAgICAgICAgICdDYycsCiAgICAgICAgICAgICAgICAgICAgJ0JjYycsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2VNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyogJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRffSApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgJ1RvIGludmFsaWQnIGVycm9yIGlmIEF1dG9Db21wbGV0ZSBpcyBlbmFibGVkCiAgICAgICAgaWYgKCAkQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSAmJiAkUGFyYW17J1RvIGludmFsaWQnfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlVG9JbnZhbGlkJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRQYXJhbXsnVHlwZVN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NpZ25LZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ0NyeXB0S2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgICAgICAnVG8nLAogICAgICAgICAgICAgICAgICAgICdDYycsCiAgICAgICAgICAgICAgICAgICAgJ0JjYycsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdTaWduS2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdDcnlwdEtleUlEJywKICAgICAgICAgICAgICAgICAgICAnT3duZXJBbGwnLAogICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZUFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgICAgICdUbycsCiAgICAgICAgICAgICAgICAgICAgJ0NjJywKICAgICAgICAgICAgICAgICAgICAnQmNjJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNlcnZpY2Ugc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAkUGFyYW17J1NlcnZpY2VTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnU2lnbktleUlEJywKICAgICAgICAgICAgICAgICAgICAnQ3J5cHRLZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgICAgICdUbycsCiAgICAgICAgICAgICAgICAgICAgJ0NjJywKICAgICAgICAgICAgICAgICAgICAnQmNjJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NpZ25LZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ0NyeXB0S2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICAgICAgJ1RvJywKICAgICAgICAgICAgICAgICAgICAnQ2MnLAogICAgICAgICAgICAgICAgICAgICdCY2MnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXsnU0xBU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnU2lnbktleUlEJywKICAgICAgICAgICAgICAgICAgICAnQ3J5cHRLZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgICAgICdUbycsCiAgICAgICAgICAgICAgICAgICAgJ0NjJywKICAgICAgICAgICAgICAgICAgICAnQmNjJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NpZ25LZXlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ0NyeXB0S2V5SUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICAgICAgJ1RvJywKICAgICAgICAgICAgICAgICAgICAnQ2MnLAogICAgICAgICAgICAgICAgICAgICdCY2MnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtJbXBhY3RzfSwKICAgICAgICBOYW1lICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgT25DaGFuZ2UgICA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyAiCiAgICAgICAgICAgIC4gImRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgIEFqYXggICAgICAgPT4gewogICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17J1ByaW9yaXR5U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtQcmlvcml0aWVzfSwKICAgICAgICBOYW1lICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICBTZWxlY3RlZCAgID0+ICRQYXJhbXtQcmlvcml0eX0sCiAgICApOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgKTsKCiAgICAjIGZyb20gdXBkYXRlCiAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb21VcGRhdGVTdWJtaXQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb25BbGxKUycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uQWxsU3VibWl0JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyByZXNwb25zaWJsZSBzZWxlY3Rpb24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXsnUmVzcG9uc2libGVPcHRpb25TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVzcG9uc2libGVVc2Vyc1NlbGVjdGVkfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZVNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uQWxsSlMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZVNlbGVjdGlvbkFsbFN1Ym1pdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUZXh0J30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydUaWNrZXRGcmVlVGltZSd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydBcnRpY2xlRnJlZVRleHQnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWRkcmVzcyBib29rCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkcmVzc0Jvb2snLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBmb3IgbXkgJERhdGFSZWYgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEVtYWlsJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RnJlZVRleHQucG0gLSBmcmVlIHRleHQgZm9yIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5wbSx2IDEuOSAyMDA5LzA5LzMwIDE3OjUyOjI5IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldEZyZWVUZXh0LnBtLHYgMS41OS4yLjEgMjAwOS8wOS8yMyAwOTo1MTo1OCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGdldCBpbmZvcm0gdXNlciBsaXN0CiAgICBteSBASW5mb3JtVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwogICAgJFNlbGYtPntJbmZvcm1Vc2VySUR9ID0gXEBJbmZvcm1Vc2VySUQ7CgogICAgIyBnZXQgaW52b2x2ZWQgdXNlciBsaXN0CiAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKICAgICRTZWxmLT57SW52b2x2ZWRVc2VySUR9ID0gXEBJbnZvbHZlZFVzZXJJRDsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFkZGl0aW9uYWwgcGFyYW1zCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gPSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRGcmVlVGltZU51bWJlciApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDA7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICAgID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHRpbWVkYXRhCiAgICAgICAgbXkgJFRpbWVEYXRhQ29tcGxldGUgPSAxOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBuZXh0IFRZUEUgaWYgZGVmaW5lZCAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CgogICAgICAgICAgICAkVGltZURhdGFDb21wbGV0ZSA9IDA7CiAgICAgICAgICAgIGxhc3QgVFlQRTsKICAgICAgICB9CgogICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVIgaWYgJFRpbWVEYXRhQ29tcGxldGU7CgogICAgICAgIGlmICggISRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApIHsKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZywKICAgICAgICApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydCb2R5IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnQXR0YWNobWVudERlbGV0ZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHRpdGxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17VGl0bGV9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0eXBlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHNlcnZpY2UKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTTEFJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBvd25lcgogICAgICAgIG15IEBOb3RpZnlEb25lOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3T3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyByZXNwb25zaWJsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgcmVzcG9uc2libGUgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIG15IEBOb3RpZnlVc2VySURzID0gKCBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSApOwogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFxATm90aWZ5RG9uZSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICMgc2tpcCBkZWxldGVkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgIG5leHQgaWYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRBdHRhY2htZW50LT57Q29udGVudElEfSA9fiAvXmlubGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0JvZHl9ICF+IC8kQXR0YWNobWVudC0+e0NvbnRlbnRJRH0vOwoKICAgICAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBsYXN0IHNjcmVlbiBvdmVydmlldyBvbiBjbG9zZWQgdGlja2V0cwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSBAVGlja2V0RnJlZVRleHRDb25maWcgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkQ29uZmlnS2V5ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAgJFRpY2tldHtRdWV1ZUlEfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ0tleSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvbmZpZ1ZhbHVlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdWYWx1ZSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCBjb25maWd1cmVkIGRlZmF1bHQgdmFycwogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0JvZHl9ICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaDsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBuZXh0IGlmICEkU3RhdGVJRDsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFJlc3VsdCA9PiAnSEFTSCcgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRGcmVlVGV4dCcsIERhdGEgPT4gXCVQYXJhbSApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Tm90ZS5wbSAtIHRvIGFkZCBub3RlcyB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXROb3RlLnBtLHYgMS4xMSAyMDA5LzA5LzMwIDE3OjUyOjMwIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUucG0sdiAxLjcxLjIuMSAyMDA5LzA5LzIzIDA5OjUxOjU4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Tm90ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgZ2V0IGluZm9ybSB1c2VyIGxpc3QKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKCiAgICAjIGdldCBpbnZvbHZlZCB1c2VyIGxpc3QKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIG93bmVyIHRvIGRvIHRoaXMgYWN0aW9uISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kCiAgICAgICAgQXR0YWNobWVudFVwbG9hZAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgIEF0dGFjaG1lbnREZWxldGUxMyBBdHRhY2htZW50RGVsZXRlMTQgQXR0YWNobWVudERlbGV0ZTE1IEF0dGFjaG1lbnREZWxldGUxNgogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0MTQiKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHJpb3JpdHlSQyIpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRWxlbWVudENoYW5nZWQiKSB8fCAnJzsKCiAgICAjIHNldCBQcmlvcml0eVJDIGZyb20gY2hhbmdlZCBhamF4IGVsZW1lbnQKICAgIGlmICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnICkKICAgICAgICB8fCAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcgKSAmJiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gICkgKQogICAgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICAjIHNldCBzZXJ2aWNlIGlkIGZyb20gdGlja2V0CiAgICBpZiAoIWRlZmluZWQoJEdldFBhcmFte1NlcnZpY2VJRH0pICYmICRUaWNrZXR7U2VydmljZUlEfSkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9OwogICAgfQoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICk7CgogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFte0ltcGFjdElEfSkgewogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIEZSRUVUSU1FTlVNQkVSOgogICAgZm9yIG15ICRGcmVlVGltZU51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBjcmVhdGUgZnJlZXRpbWUgcHJlZml4CiAgICAgICAgbXkgJEZyZWVUaW1lUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRGcmVlVGltZU51bWJlcjsKCiAgICAgICAgIyBnZXQgZm9ybSBwYXJhbXMKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICRGcmVlVGltZVByZWZpeCAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVldGltZSBkYXRhIGZyb20gdGlja2V0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lU3RyaW5nID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGlja2V0eyRGcmVlVGltZVByZWZpeH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpY2tldEZyZWVUaW1lU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdEYXknIH0gICAgPSAkRGF5OwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICBteSAkU2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSB8fCA3MDsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsJFNpemV9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBzdG9yZSBhY3Rpb24KICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHN0YXRlIHR5cGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3QgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0JvZHkgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskX30gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdBdHRhY2htZW50RGVsZXRlJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGV4cGFuZAogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7RXhwYW5kfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdGl0bGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHR5cGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgc2VydmljZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NMQUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IG93bmVyCiAgICAgICAgbXkgQE5vdGlmeURvbmU7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSBvd25lciB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSBvd25lciB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdPd25lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHJlc3BvbnNpYmxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSByZXNwb25zaWJsZSB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbm90ZQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGcm9tID0gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgbXkgQE5vdGlmeVVzZXJJRHMgPSAoIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9ICk7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFxATm90aWZ5VXNlcklEcywKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gXEBOb3RpZnlEb25lLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBza2lwIGRlbGV0ZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgbmV4dCBpZiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ID1+IC9eaW5saW5lLwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Qm9keX0gIX4gLyRBdHRhY2htZW50LT57Q29udGVudElEfS87CgogICAgICAgICAgICAgICAgIyB3cml0ZSBleGlzdGluZyBmaWxlIHRvIGJhY2tlbmQKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17JFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCgkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gMTMsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ID0+ICdJbXBhY3RJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0gfHwgJycsCiAgICAgICAgICAgIENvdW50ZXIgPT4gMTQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgICVUaW1lLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17JFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSAmJiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGxhc3Qgc2NyZWVuIG92ZXJ2aWV3IG9uIGNsb3NlZCB0aWNrZXRzCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSRTZWxmLT57VGlja2V0SUR9JkFydGljbGVJRD0kQXJ0aWNsZUlEIgogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKCiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBUaWNrZXRGcmVlVGV4dENvbmZpZyA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ29uZmlnVmFsdWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAgJFRpY2tldHtRdWV1ZUlEfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ1ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzZSB7CgogICAgICAgICMgZmlsbHVwIGNvbmZpZ3VyZWQgZGVmYXVsdCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17Qm9keX0gJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0sCiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQgPT4gJFRpY2tldHtQcmlvcml0eUlEfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICVTZXJ2aWNlID0gKCAnJywgJy0nICk7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICBPbkNoYW5nZSA9PgojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMCkiLAogICAgICAgICk7CiAgICAgICAgbXkgJVVzZXJIYXNoOwogICAgICAgIGlmIChAT2xkVXNlckluZm8pIHsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAxOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBPbGRVc2VySW5mbyApIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISVVc2VySGFzaCApIHsKICAgICAgICAgICAgJFVzZXJIYXNoeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T2xkT3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPbGRPd25lcklEJywKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDIpIiwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lckpzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9IHx8ICRUaWNrZXR7UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgIG15ICVTdGF0ZSAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRTdGF0ZUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3U3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICRQYXJhbXtTdGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRTdGF0ZUlEOwogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJFN0YXRlSUQgKTsKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAgICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtJbXBhY3RzfSwKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwojIC0tLQogICAgICAgIG15ICVQcmlvcml0eTsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlSnMnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZ2VudCBsaXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbmZvcm1Vc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5JbnZvbHZlZEFnZW50cyggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgICAgIG15ICRDb3VudGVyICA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZSA9ICgpOwogICAgICAgIGlmICggISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggUmVzdWx0ID0+ICdIQVNIJyApOwogICAgICAgIGZvciAoIGtleXMgJU5vdGVUeXBlcyApIHsKICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5vdGVUeXBlc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE5vdGUnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0T3duZXIucG0gLSBzZXQgdGlja2V0IG93bmVyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE93bmVyLnBtLHYgMS4xMCAyMDA5LzA5LzMwIDE3OjUyOjMwIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE93bmVyLnBtLHYgMS42NC4yLjEgMjAwOS8wOS8yMyAwOTo1MTo1OCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldE93bmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRpY2tldElEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSwKICAgICAgICApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ0F0dGFjaG1lbnREZWxldGUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICBteSBATm90aWZ5VXNlcklEcyA9ICggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0gKTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gXEBOb3RpZnlVc2VySURzLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBcQE5vdGlmeURvbmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNraXAgZGVsZXRlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gPX4gL15pbmxpbmUvCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJEF0dGFjaG1lbnQtPntDb250ZW50SUR9LzsKCiAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgY29uZmlndXJlZCBkZWZhdWx0IHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtCb2R5fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2g7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFN0YXRlSUQ7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBSZXN1bHQgPT4gJ0hBU0gnICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3duZXInLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGVuZGluZy5wbSAtIHNldCB0aWNrZXQgdG8gcGVuZGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQZW5kaW5nLnBtLHYgMS45IDIwMDkvMDkvMzAgMTc6NTM6MDUgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGVuZGluZy5wbSx2IDEuNjkuMi4xIDIwMDkvMDkvMjMgMDk6NTE6NTggbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQZW5kaW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGdldCBpbmZvcm0gdXNlciBsaXN0CiAgICBteSBASW5mb3JtVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwogICAgJFNlbGYtPntJbmZvcm1Vc2VySUR9ID0gXEBJbmZvcm1Vc2VySUQ7CgogICAgIyBnZXQgaW52b2x2ZWQgdXNlciBsaXN0CiAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKICAgICRTZWxmLT57SW52b2x2ZWRVc2VySUR9ID0gXEBJbnZvbHZlZFVzZXJJRDsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gVGlja2V0SUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFkZGl0aW9uYWwgcGFyYW1zCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gPSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRGcmVlVGltZU51bWJlciApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDA7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICAgID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHRpbWVkYXRhCiAgICAgICAgbXkgJFRpbWVEYXRhQ29tcGxldGUgPSAxOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBuZXh0IFRZUEUgaWYgZGVmaW5lZCAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CgogICAgICAgICAgICAkVGltZURhdGFDb21wbGV0ZSA9IDA7CiAgICAgICAgICAgIGxhc3QgVFlQRTsKICAgICAgICB9CgogICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVIgaWYgJFRpbWVEYXRhQ29tcGxldGU7CgogICAgICAgIGlmICggISRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApIHsKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZywKICAgICAgICApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydCb2R5IGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnQXR0YWNobWVudERlbGV0ZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHRpdGxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17VGl0bGV9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0eXBlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHNlcnZpY2UKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtTTEFJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBvd25lcgogICAgICAgIG15IEBOb3RpZnlEb25lOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgb3duZXIgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3T3duZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyByZXNwb25zaWJsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRvIG5vdCBub3RpZnkgcmVzcG9uc2libGUgdHdpY2UKICAgICAgICAgICAgICAgIGlmICggJFN1Y2Nlc3MgJiYgJFN1Y2Nlc3MgZXEgMSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlEb25lLCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIG15IEBOb3RpZnlVc2VySURzID0gKCBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSApOwogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFxATm90aWZ5RG9uZSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICMgc2tpcCBkZWxldGVkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgIG5leHQgaWYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRBdHRhY2htZW50LT57Q29udGVudElEfSA9fiAvXmlubGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0JvZHl9ICF+IC8kQXR0YWNobWVudC0+e0NvbnRlbnRJRH0vOwoKICAgICAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBsYXN0IHNjcmVlbiBvdmVydmlldyBvbiBjbG9zZWQgdGlja2V0cwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSBAVGlja2V0RnJlZVRleHRDb25maWcgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkQ29uZmlnS2V5ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAgJFRpY2tldHtRdWV1ZUlEfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ0tleSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvbmZpZ1ZhbHVlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdWYWx1ZSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCBjb25maWd1cmVkIGRlZmF1bHQgdmFycwogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0JvZHl9ICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaDsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBuZXh0IGlmICEkU3RhdGVJRDsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFJlc3VsdCA9PiAnSEFTSCcgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRQZW5kaW5nJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0gLSB0byBoYW5kbGUgcGhvbmUgY2FsbHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0UGhvbmUucG0sdiAxLjE1IDIwMTAvMDEvMjAgMTM6NTM6NTAgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGhvbmUucG0sdiAxLjExMy4yLjIgMjAxMC8wMS8wNyAyMjoyNjowMiBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFBob25lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgTWFpbDo6QWRkcmVzczsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE1ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBmb3IgKAogICAgICAgIHF3KEF0dGFjaG1lbnRVcGxvYWQgQXJ0aWNsZUlEIExpbmtUaWNrZXRJRCBQcmlvcml0eUlEIE5ld1VzZXJJRAogICAgICAgIEZyb20gU3ViamVjdCBCb2R5IE5leHRTdGF0ZUlEIFRpbWVVbml0cwogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBSZXNwb25zaWJsZUFsbCBPd25lckFsbCBUeXBlSUQgU2VydmljZUlEIFNMQUlECiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1RpY2tldEZyZWVUZXh0MTQnKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgIGlmICggICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnCiAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgbXkgJVNlcnZpY2U7CiAgICBteSAkSW1wYWN0TGlzdCA9IHt9OwogICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CiAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0ltcGFjdElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0MTQ6OkRlZmF1bHRTZWxlY3Rpb24nKTsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0IGlkCiAgICAgICAgICAgIG15ICVJbXBhY3RMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW1wYWN0TGlzdH07CiAgICAgICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICA9ICRJbXBhY3RMaXN0UmV2ZXJzZXskRGVmYXVsdFNlbGVjdGlvbn07CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gKSB7CgogICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgIlRpY2tldEZyZWVUaW1lIiAuICRfIC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICJUaWNrZXRGcmVlVGltZSIgLiAkXyAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdPcHRpb25hbCcgfQogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkXyApIHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRfICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAgICAgIyBub3RpZnkgaW5mbwogICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICdUaWNrZXQgIiVzIiBjcmVhdGVkISIsICInIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgTGluayA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JyAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZS8KICAgICAgICAgICAgJiYgJFNlbGYtPntSZXF1ZXN0ZWRVUkx9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZS4qTGlua1RpY2tldElEPS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzcGxpdCBhcnRpY2xlIGlmIGdpdmVuCiAgICAgICAgIyBnZXQgQXJ0aWNsZUlECiAgICAgICAgbXkgJUFydGljbGUgICAgICA9ICgpOwogICAgICAgIG15ICVDdXN0b21lckRhdGEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCggQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9ICk7CiAgICAgICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbGwgZnJlZSB0ZXh0IGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSA9ICRBcnRpY2xleyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ID0gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWxsIGZyZWUgdGltZSBmaWVsZHMKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdVc2VkJyB9ID0gMTsKICAgICAgICAgICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ01pbnV0ZScgfSA9ICRNaW47CgogICAgICAgICAgICAgICAgICAgICMgZG8gYWdlbnQgdGltZSB6b25lIHRyYW5zbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYm9keSBwcmVwYXJhdGlvbiBmb3IgcGxhaW4gdGV4dCBwcm9jZXNzaW5nCiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hPYmplY3QgICA9PiAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudHNJbmNsdWRlID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZXtGcm9tfSA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVEZWZhdWx0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVEZWZhdWx0eyAnVGlja2V0RnJlZUtleScgLiAkXyB9ID0gJEdldFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkXyB9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVLZXknIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICAkVGlja2V0RnJlZURlZmF1bHR7ICdUaWNrZXRGcmVlVGV4dCcgLiAkXyB9ID0gJEdldFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJF8gfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkXyAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZURlZmF1bHQsCiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlRGVmYXVsdCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJEFydGljbGVGcmVlRGVmYXVsdHsgJ0FydGljbGVGcmVlS2V5JyAuICRfIH0gPSAkR2V0UGFyYW17ICdBcnRpY2xlRnJlZUtleScgLiAkXyB9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ0FydGljbGVGcmVlS2V5JyAuICRfIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlRGVmYXVsdHsgJ0FydGljbGVGcmVlVGV4dCcgLiAkXyB9ID0gJEdldFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0JyAuICRfIH0KICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnQXJ0aWNsZUZyZWVUZXh0JyAuICRfIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICB9CgogICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7Q3VzdG9tZXJVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4geyAlR2V0UGFyYW0sICVBcnRpY2xlRnJlZURlZmF1bHQsIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbmQgZm9ybWF0IGRlZmF1bHQgc3ViamVjdCBhbmQgYm9keQogICAgICAgIG15ICRTdWJqZWN0ID0gJEFydGljbGV7U3ViamVjdH07CiAgICAgICAgaWYgKCAhJFN1YmplY3QgKSB7CiAgICAgICAgICAgICRTdWJqZWN0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJEJvZHkgPSAkQXJ0aWNsZXtCb2R5fSB8fCAnJzsKICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgIGlmICggISRHZXRQYXJhbXtBcnRpY2xlSUR9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICAgICAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICApLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7Q3VzdG9tZXJVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICBTTEFzICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBVc2VycyAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEZyb20gICAgICAgICA9PiAkQXJ0aWNsZXtGcm9tfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQXJ0aWNsZXtDdXN0b21lcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgTGlua1RpY2tldElEID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9IHx8ICcnLAoKICAgICAgICAgICAgIyAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKICAgICAgICBteSAlRXJyb3IgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte05leHRTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTmV4dFN0YXRlID0gJFN0YXRlRGF0YXtOYW1lfSB8fCAnJzsKICAgICAgICBteSAkRGVzdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJFRvICkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdFeHBhbmRDdXN0b21lck5hbWUnICkKICAgICAgICAgICAgfHwgMDsKCiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhckZyb20nICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRfIiApIHx8IDA7CiAgICAgICAgICAgIGlmICggJF8gPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJF8gPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICYmICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9CiAgICAgICAgICAgICAgICA9fiBzLyhePi4rfC57NCwkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyl9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9eydUaWNrZXRGcmVlVGV4dCd9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJ2ludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtLCApOwoKICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwogICAgICAgIGlmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAxICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXIKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAoKTsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yICgga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9Kys7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9ICAgICA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fTsKICAgICAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kQ3VzdG9tZXJOYW1lIn0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtb3JlIHRoZSBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGRvbid0IGNoZWNrIGVtYWlsIHN5bnRheCBvbiBtdWx0aSBjdXN0b21lciBzZWxlY3QKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KCBLZXkgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLCBWYWx1ZSA9PiAwICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFteyJGcm9tT3B0aW9ucyJ9ID0gXCVDdXN0b21lclVzZXJMaXN0OwoKICAgICAgICAgICAgICAgICMgY2xlYXIgZnJvbSBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7IkV4cGFuZEN1c3RvbWVyTmFtZSJ9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQ3VzdG9tZXJVc2VyTGlzdHskX307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyAnanVzdCcgbm8gc3VibWl0CiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDQgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tIGludmFsaWQnfSAuPSAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkR2V0UGFyYW17RnJvbX0gJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSAhPSAxICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydGcm9tIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0IGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwICkgewogICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQsIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0gKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlclNlbGVjdGVkID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBGcm9tT3B0aW9ucyAgPT4gJFBhcmFte0Zyb21PcHRpb25zfSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRvcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApLAogICAgICAgICAgICAgICAgVG9TZWxlY3RlZCAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IHRpY2tldCwgZG8gZGIgaW5zZXJ0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDE0LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgICVUaW1lLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2goIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZiApOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YSA9ICgpOwogICAgICAgICAgICBSRU1PVkVJTkxJTkU6CiAgICAgICAgICAgIGZvciBteSAkVG1wQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBuZXh0IFJFTU9WRUlOTElORSBpZiAkVG1wQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRtcEF0dGFjaG1lbnQtPntDb250ZW50SUR9ID1+IC9eaW5saW5lLwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Qm9keX0gIX4gLyRUbXBBdHRhY2htZW50LT57Q29udGVudElEfS87CiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JFRtcEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICggJEdldFBhcmFte05ld1VzZXJJRH0gKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICA9PiAkVG8sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICBPcmlnSGVhZGVyICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEZyb20gICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgVG8gICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gKSwKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBcnRpY2xlSUQpIHsKCiAgICAgICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IG93bmVyIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VXNlcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlbHNlIHNldCBvd25lciB0byBjdXJyZW50IGFnZW50IGJ1dCBkbyBub3QgbG9jayBpdAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRSZWZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIGxpbmsgdGlja2V0cwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TGlua1RpY2tldElEfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0KICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3VsZCBpIHNldCBhbiB1bmxvY2s/CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gKTsKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBrZXlzICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0eXBlbGlzdAogICAgICAgICAgICAgICAgICAgIG15ICRUeXBlTGlzdCA9ICRUZW1wTGlua0xpc3QtPnskVGFyZ2V0T2JqZWN0T3JnfTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUeXBlICgga2V5cyAleyRUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkVHlwZUxpc3QtPnskVHlwZX07CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBrZXlzICV7ICREaXJlY3Rpb25MaXN0LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIHRlbXAgbGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTEgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QyID0+ICRUYXJnZXRPYmplY3RPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTIgICAgPT4gJFRhcmdldEtleU9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNvdXJjZU9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNvdXJjZUtleSAgICA9ICRUYXJnZXRLZXlPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldE9iamVjdCA9ICdUaWNrZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgICAgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERpcmVjdGlvbiBlcSAnVGFyZ2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZU9iamVjdCA9ICdUaWNrZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlS2V5ICAgID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0T2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldEtleSAgICA9ICRUYXJnZXRLZXlPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aGUgcGVybWFuZW50bHkgbGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICRTb3VyY2VPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJFRhcmdldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojIC0tLQoKICAgICAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldFBob25lJzsKCiAgICAgICAgICAgICMgcmVkaXJlY3QKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSROZXh0U2NyZWVuJlN1YmFjdGlvbj1DcmVhdGVkJlRpY2tldElEPSRUaWNrZXRJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBUaWNrZXRGcmVlVGV4dENvbmZpZyA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ0tleSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENvbmZpZ1ZhbHVlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZVVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBTdWJhY3Rpb24hIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW4nLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVOZXh0U3RhdGVzID0gKCk7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yICgga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRfICkgewogICAgICAgICAgICAgICAgICAgICRIaXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRIaXQgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3J3JywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwogICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JF99ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVByaW9yaXRpZXMgPSAoKTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVHlwZSA9ICgpOwoKICAgICMgZ2V0IHR5cGUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU2VydmljZSA9ICgpOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIGlmICggKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTTEEgPSAoKTsKCiAgICAjIGdldCBzbGEKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zID0gKCk7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eydUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbid9ICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPnsnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3MgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9NYXNrUGhvbmVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgbXkgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJyk7CiAgICBpZiAoICRBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW5RdWVyeUxlbmd0aCAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNaW5RdWVyeUxlbmd0aH0gICAgICB8fCAyLAogICAgICAgICAgICAgICAgcXVlcnlEZWxheSAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57UXVlcnlEZWxheX0gICAgICAgICAgfHwgMC4xLAogICAgICAgICAgICAgICAgdHlwZUFoZWFkICAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57VHlwZUFoZWFkfSAgICAgICAgICAgfHwgJ2ZhbHNlJywKICAgICAgICAgICAgICAgIG1heFJlc3VsdHNEaXNwbGF5ZWQgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01heFJlc3VsdHNEaXNwbGF5ZWR9IHx8IDIwLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZTdGFydCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaEN1c3RvbWVyQnV0dG9uJywKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17J09wdGlvblN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXsnTmV4dFN0YXRlc1N0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgZnJvbSBzdHJpbmcKICAgIGlmICggJFBhcmFte0Zyb21PcHRpb25zfSAmJiAleyAkUGFyYW17RnJvbU9wdGlvbnN9IH0gKSB7CiAgICAgICAgJFBhcmFteydDdXN0b21lclVzZXJTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUGFyYW17RnJvbU9wdGlvbnN9LAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gNzAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNvIHN0cmluZwogICAgbXkgJU5ld1RvID0gKCk7CiAgICBpZiAoICRQYXJhbXtUb30gKSB7CiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17VG99IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJF98fCRQYXJhbXtUb30tPnskX30ifSA9ICRQYXJhbXtUb30tPnskX307CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAkUGFyYW17J1RvU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17J1RvU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17Q3VzdG9tZXJEYXRhfSwKICAgICAgICAgICAgTWF4ICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZU1heFNpemUnKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgKCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAnKiAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JF99ICk7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSAnRnJvbSBpbnZhbGlkJyBlcnJvciBpZiBBdXRvQ29tcGxldGUgaXMgZW5hYmxlZAogICAgICAgIGlmICggJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0FjdGl2ZX0gJiYgJFBhcmFteydGcm9tIGludmFsaWQnfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRnJvbUludmFsaWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFteydUeXBlU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBzZXJ2aWNlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgJFBhcmFteydTZXJ2aWNlU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnT3duZXJBbGwnLAogICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZUFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXsnU0xBU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICBPbkNoYW5nZSAgID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7ICIKICAgICAgICAgICAgLiAiZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgQWpheCAgICAgICA9PiB7CiAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKICAgIGlmICggJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAkUGFyYW17UHJpb3JpdHlJRH0gPSAkUGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgfQojIC0tLQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fTsKICAgIH0KICAgICRQYXJhbXsnUHJpb3JpdHlTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte1ByaW9yaXR5fSwKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICApOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgKTsKCiAgICAjIHRvIHVwZGF0ZQogICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1VwZGF0ZVN1Ym1pdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld093bmVyU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPd25lclNlbGVjdGlvbkFsbEpTJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb25BbGxTdWJtaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJgogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdSZXNwb25zaWJsZVNlbGVjdGlvbicpCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXsnUmVzcG9uc2libGVPcHRpb25TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlclNlbGVjdGVkfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZVNlbGVjdGlvbkFsbEpTJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb25BbGxTdWJtaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydUaWNrZXRGcmVlVGV4dCd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRpbWUnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnQXJ0aWNsZUZyZWVUZXh0J30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBmb3IgbXkgJERhdGFSZWYgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFBob25lJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQcmludC5wbSx2IDEuNSAyMDEwLzAyLzExIDIyOjE2OjEwIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LnBtLHYgMS42NC4yLjEgMjAxMC8wMi8wMyAxMzowOTowMyBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCBVc2VyT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKTsKCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSB8fCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRBY2Nlc3M7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdHlwZSBsaXN0CiAgICBteSAlTGlua1R5cGVMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpbmsgZGF0YQogICAgbXkgJUxpbmtEYXRhOwogICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICVMaW5rRGF0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxM30pIHsKICAgICAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkVGlja2V0e0ltcGFjdH0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSkgewogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9fTsKICAgIH0KIyAtLS0KICAgIG15IEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgb25seSBvbmUgYXJ0aWNsZSBuZWVkIHByaW50ZWQKICAgIGlmICgkQXJ0aWNsZUlEKSB7CiAgICAgICAgbXkgQE5ld0FydGljbGVCb3g7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlLT57QXJ0aWNsZUlEfSA9PSAkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgQE5ld0FydGljbGVCb3ggPSAoJEFydGljbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChATmV3QXJ0aWNsZUJveCkgewogICAgICAgICAgICBAQXJ0aWNsZUJveCA9IEBOZXdBcnRpY2xlQm94OwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc29ydCBhcnRpY2xlIG9yZGVyCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyApIHsKICAgICAgICBAQXJ0aWNsZUJveCA9IHJldmVyc2UoQEFydGljbGVCb3gpOwogICAgfQoKICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICk7CgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXIgICA9PiAkVGlja2V0e093bmVyfSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyByZXNwb25zaWJsZSBpbmZvCiAgICBteSAlUmVzcG9uc2libGVJbmZvOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICVSZXNwb25zaWJsZUluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlciAgID0+ICRUaWNrZXR7UmVzcG9uc2libGV9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVGlja2V0e0N1c3RvbWVySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gc29tZSBodG1sIHF1b3RpbmcKICAgICRUaWNrZXR7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJFRpY2tldHtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJywKICAgICk7CgogICAgaWYgKCAkVGlja2V0e1VudGlsVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICctJzsKICAgIH0KCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICRQcmludGVkQnkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgncHJpbnRlZCBieScpOwogICAgICAgIG15ICRUaW1lICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJyRFbnZ7IlRpbWUifScgKTsKICAgICAgICBteSAkVXJsICAgICAgID0gJyAnOwogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSHR0cFR5cGUnKSAuICc6Ly8nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgICAgIC4gJEVOVntSRVFVRVNUX1VSSX07CiAgICAgICAgfQogICAgICAgIG15ICVQYWdlOwoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KICAgICAgICBteSAkSGVhZGVyUmlnaHQgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICRIZWFkbGluZUxlZnQgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgbXkgJFRpdGxlICAgICAgICA9ICRIZWFkZXJSaWdodDsKICAgICAgICBpZiAoICRUaWNrZXR7VGl0bGV9ICkgewogICAgICAgICAgICAkSGVhZGxpbmVMZWZ0ID0gJFRpY2tldHtUaXRsZX07CiAgICAgICAgICAgICRUaXRsZSAuPSAnIC8gJyAuICRUaWNrZXR7VGl0bGV9OwogICAgICAgIH0KCiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSA9ICRIZWFkbGluZUxlZnQ7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0KICAgICAgICAgICAgPSAkUHJpbnRlZEJ5IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFRpbWU7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAkVXJsOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BhZ2UnKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBwZGYgZG9jdW1lbnQKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50TmV3KAogICAgICAgICAgICBUaXRsZSAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkVGl0bGUsCiAgICAgICAgICAgIEVuY29kZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgZmlyc3QgcGRmIHBhZ2UKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEluZm9zKAogICAgICAgICAgICBQYWdlRGF0YSAgICAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIFVzZXJEYXRhICAgICAgICA9PiBcJVVzZXJJbmZvLAogICAgICAgICAgICBSZXNwb25zaWJsZURhdGEgPT4gXCVSZXNwb25zaWJsZUluZm8sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGZyZWV0ZXh0IGZpZWxkcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RnJlZVRleHQoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZSBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEZyZWVUaW1lKAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaW5rZWQgb2JqZWN0cwogICAgICAgIGlmICglTGlua0RhdGEpIHsKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRMaW5rZWRPYmplY3RzKAogICAgICAgICAgICAgICAgUGFnZURhdGEgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgICAgIExpbmtEYXRhICAgICA9PiBcJUxpbmtEYXRhLAogICAgICAgICAgICAgICAgTGlua1R5cGVMaXN0ID0+IFwlTGlua1R5cGVMaXN0LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dEN1c3RvbWVySW5mb3MoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXJ0aWNsZXMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEFydGljbGVzKAogICAgICAgICAgICBQYWdlRGF0YSAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIEFydGljbGVEYXRhID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJ3RpY2tldF8nIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwogICAgICAgIG15ICRQREZTdHJpbmcgPSAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vcGRmIiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CgogICAgICAgIGlmICglTGlua0RhdGEpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUeXBlTmFtZSA9PiAkTGlua1R5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICAgICAgICAgIG15ICRPYmplY3RMaXN0ID0gJExpbmtEYXRheyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZVJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rU3RyZyA9PiAkSXRlbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBNYXggID0+IDEwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aWNrZXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fSFRNTE1hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBcnRpY2xlQm94ICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICBSZXNwb25zaWJsZURhdGEgPT4gXCVSZXNwb25zaWJsZUluZm8sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVVzZXJJbmZvLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICAjIHJldHVybiBvdXRwdXQKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRUaWNrZXRJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEgVXNlckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ICAgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVVc2VySW5mbyA9ICV7ICRQYXJhbXtVc2VyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1N0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1N0YXRlfSApLAogICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICB7CiMgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJpb3JpdHknKSAuICc6JywKIyAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1ByaW9yaXR5fSApLAojICAgICAgICB9LAojIC0tLQogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1F1ZXVlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UXVldWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTG9jaycpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFRpY2tldHtMb2NrfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXJJRCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnT3duZXInKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtPd25lcn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkVXNlckluZm97VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgXTsKCiAgICAjIGFkZCByZXNwb25zaWJsZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgIG15ICRSZXNwb25zaWJsZSA9ICctJzsKICAgICAgICBpZiAoICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUKICAgICAgICAgICAgICAgID0gJFRpY2tldHtSZXNwb25zaWJsZX0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyTGFzdG5hbWV9IC4gJyknOwogICAgICAgIH0KICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUmVzcG9uc2libGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3BvbnNpYmxlLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHR5cGUgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VHlwZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgc2VydmljZSBhbmQgc2xhIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgICAgICBteSAkUm93U0xBID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NMQScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15ICRUYWJsZUxlZnRFeHRlbmRlZCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ltcGFjdCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7UHJpb3JpdHl9KSwKICAgICAgICB9LAogICAgXTsKICAgIHB1c2goQHskVGFibGVMZWZ0fSwgQHskVGFibGVMZWZ0RXh0ZW5kZWR9KTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0FnZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBY2NvdW50ZWQgdGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldFRpbWVVbml0c30sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQZW5kaW5nIHRpbGwnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtQZW5kaW5nVW50aWx9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIGZpcnN0IHJlc3BvbnNlIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHVwZGF0ZSB0aW1lIHJvdwogICAgaWYgKCBkZWZpbmVkKCAkVGlja2V0e1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1VwZGF0ZSBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHNvbHV0aW9uIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7U29sdXRpb25UaW1lfSApICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTb2x1dGlvbiBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0TGlua2VkT2JqZWN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIExpbmtEYXRhIExpbmtUeXBlTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlUGFnZSAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVHlwZUxpc3QgPSAleyAkUGFyYW17TGlua1R5cGVMaXN0fSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7ICRQYXJhbXtMaW5rRGF0YX0gfSApIHsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwogICAgICAgIG15ICRMaW5rVHlwZU5hbWUgPSAkVHlwZUxpc3R7ICRMaW5rRGF0YVswXSB9LT57ICRMaW5rRGF0YVsxXSAuICdOYW1lJyB9OwogICAgICAgICRMaW5rVHlwZU5hbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkTGlua1R5cGVOYW1lKTsKCiAgICAgICAgIyBkZWZpbmUgaGVhZGxpbmUKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGlua1R5cGVOYW1lIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAnJzsKCiAgICAgICAgIyBleHRyYWN0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkUGFyYW17TGlua0RhdGF9LT57JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkT2JqZWN0TGlzdC0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9IHx8PSAnJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRJdGVtLT57VGl0bGV9IHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlIHsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xpbmtlZCBPYmplY3RzJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIHRhYmxlIHBhcmFtcwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkXyBlcSAxMyB8fCAkXyBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUZXh0JF8ifSBuZSAiIiApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZUtleSRfIn0gLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZVRleHQkXyJ9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRleHQKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0JyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJF8ifSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lS2V5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkXyApIHx8ICcnOwogICAgICAgICAgICBteSAkVGlja2V0RnJlZVRpbWUgPSAkVGlja2V0eyJUaWNrZXRGcmVlVGltZSRfIn07CgogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGlja2V0RnJlZVRpbWVLZXkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRGcmVlVGltZSA9PiAkVGlja2V0RnJlZVRpbWUsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZQogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRpbWUnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0Q3VzdG9tZXJJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIEN1c3RvbWVyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgPSAwOwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICV7ICRQYXJhbXtDdXN0b21lckRhdGF9IH07CiAgICBteSAlUGFnZSAgICAgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKICAgIG15ICRNYXAgPSAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntNYXB9OwoKICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQKICAgIGlmICggJEN1c3RvbWVyRGF0YXtDb25maWd9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgbXkgJE1hcDIgPSAkQ3VzdG9tZXJEYXRhe0NvbXBhbnlDb25maWd9LT57TWFwfTsKICAgICAgICBpZiAoJE1hcDIpIHsKICAgICAgICAgICAgcHVzaCggQHskTWFwfSwgQHskTWFwMn0gKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJEZpZWxkICggQHskTWFwfSApIHsKICAgICAgICBpZiAoICR7JEZpZWxkfVszXSAmJiAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfSApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkeyRGaWVsZH1bMV0gKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfTsKCiAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgJE91dHB1dCA9IDE7CiAgICAgICAgfQogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXIgSW5mb3MnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBBcnRpY2xlRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRGaXJzdEFydGljbGUgPSAxOwogICAgZm9yIG15ICRBcnRpY2xlVG1wICggQHsgJFBhcmFte0FydGljbGVEYXRhfSB9ICkgewogICAgICAgIGlmICgkRmlyc3RBcnRpY2xlKSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FydGljbGVzJyksCiAgICAgICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaXJzdEFydGljbGUgPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICBteSAkQXR0YWNobWVudHM7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEF0dGFjaG1lbnRzIC49ICRGaWxle0ZpbGVuYW1lfSAuICcgKCcgLiAkRmlsZXtGaWxlc2l6ZX0gLiAiKVxuIjsKICAgICAgICB9CgogICAgICAgICRBcnRpY2xleydBY2NvdW50ZWQgdGltZSd9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBhcnRpY2xlIGluZm8gdGFibGUKICAgICAgICBteSAlVGFibGVQYXJhbTE7CiAgICAgICAgbXkgJFJvdyA9IDA7CiAgICAgICAgZm9yICggJ0Zyb20nLCAnVG8nLCAnQ2MnLCAnQWNjb3VudGVkIHRpbWUnLCAnU3ViamVjdCcsICkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRffSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRfKSAuICc6JzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7JF99OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICBEYXRhICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdieScpOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gLj0gJyAnIC4gJEFydGljbGV7U2VuZGVyVHlwZX07CiAgICAgICAgJFJvdysrOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKCiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJEFydGljbGV7IkFydGljbGVGcmVlS2V5JF8ifSAuICc6JzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn07CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVHlwZScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xle0FydGljbGVUeXBlfTsKICAgICAgICAkUm93Kys7CgogICAgICAgIGlmICgkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQXR0YWNobWVudCcpIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICBjaG9tcCgkQXR0YWNobWVudHMpOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEF0dGFjaG1lbnRzOwogICAgICAgIH0KICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgaW5mb3MpCiAgICAgICAgJFRhYmxlUGFyYW0xe1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTF7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFtMXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBpbmZvcykKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbTEgPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbTEsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTF7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGJvZHkpCiAgICAgICAgbXkgJVRhYmxlUGFyYW0yOwogICAgICAgICRUYWJsZVBhcmFtMntDZWxsRGF0YX1bMF1bMF17Q29udGVudH0gPSAkQXJ0aWNsZXtCb2R5fSB8fCAnICc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1R5cGV9ICAgICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMntCb3JkZXJ9ICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMntGb250fSAgICAgICAgICAgICAgICAgICAgPSAnTW9ub3NwYWNlZCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnRTaXplfSAgICAgICAgICAgICAgICA9IDc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JhY2tncm91bmRDb2xvcn0gICAgICAgICA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ30gICAgICAgICAgICAgICAgID0gNDsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ1RvcH0gICAgICAgICAgICAgID0gODsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ0JvdHRvbX0gICAgICAgICAgID0gODsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgYm9keSkKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbTIgPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbTIsICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbTJ7U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVE1MTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3V0cHV0IHJlc3BvbnNpYmxlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSApIHsKICAgICAgICBteSAkUmVzcG9uc2libGUgPSAnLSc7CiAgICAgICAgaWYgKCAkUGFyYW17UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUKICAgICAgICAgICAgICAgID0gJFBhcmFte1Jlc3BvbnNpYmxlfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJMYXN0bmFtZX0gLiAnKSc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7IFJlc3BvbnNpYmxlU3RyaW5nID0+ICRSZXNwb25zaWJsZSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHR5cGUsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2aWNlIGFuZCBzbGEsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZSA9PiAkUGFyYW17U2VydmljZX0gfHwgJy0nLAogICAgICAgICAgICAgICAgU0xBICAgICA9PiAkUGFyYW17U0xBfSAgICAgfHwgJy0nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgZmlyc3QgcmVzcG9uc2UgdGltZQogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdXBkYXRlIHRpbWUKICAgIGlmICggZGVmaW5lZCggJFBhcmFte1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzb2x1dGlvbiB0aW1lCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtTb2x1dGlvblRpbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkQ291bnQgZXEgMTMgfHwgJENvdW50IGVxIDE0KSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW17QXJ0aWNsZUlEfSB8fCAnJzsKICAgIG15IEBBcnRpY2xlQm94ID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBnZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9ID0gJyc7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWxle0ZpbGVuYW1lfSApOwogICAgICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9CiAgICAgICAgICAgICAgICAuPSAnPGEgaHJlZj0iJEVudnsiQ0dJSGFuZGxlIn0vJFFEYXRheyJGaWxlbmFtZSJ9P0FjdGlvbj1BZ2VudFRpY2tldEF0dGFjaG1lbnQmJwogICAgICAgICAgICAgICAgLiAiQXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0mRmlsZUlEPSRGaWxlSURcIiB0YXJnZXQ9XCJhdHRhY2htZW50XCIgIgogICAgICAgICAgICAgICAgLiAib25tb3VzZW92ZXI9XCJ3aW5kb3cuc3RhdHVzPSdcJFRleHR7XCJEb3dubG9hZFwifTogJEZpbGV7RmlsZW5hbWV9JzsiCiAgICAgICAgICAgICAgICAuICcgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPVwnXCc7Ij4nCiAgICAgICAgICAgICAgICAuICIkRmlsZXtGaWxlbmFtZX08L2E+ICRGaWxle0ZpbGVzaXplfTxicj4iOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICk7CiAgICAgICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAgICAgJFBhcmFte1RleHROb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpLAogICAgICAgICAgICAgICAgVGV4dCAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgICAgIFZNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgICAgIG15ICRDaGFyc2V0VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tDaGFyc2V0KAogICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ2hhcnNldFRleHQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXsnQXJ0aWNsZTo6VGV4dE5vdGUnfSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgICAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKSApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiUm93IiwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdUaW1lJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZVRpbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByaW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpb3JpdHkucG0gLSBzZXQgdGlja2V0IHByaW9yaXR5CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW9yaXR5LnBtLHYgMS45IDIwMDkvMDkvMzAgMTc6NTM6MDUgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UHJpb3JpdHkucG0sdiAxLjU4LjIuMSAyMDA5LzA5LzIzIDA5OjUxOjU4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UHJpb3JpdHk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgZ2V0IGluZm9ybSB1c2VyIGxpc3QKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKCiAgICAjIGdldCBpbnZvbHZlZCB1c2VyIGxpc3QKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIG93bmVyIHRvIGRvIHRoaXMgYWN0aW9uISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kCiAgICAgICAgQXR0YWNobWVudFVwbG9hZAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgIEF0dGFjaG1lbnREZWxldGUxMyBBdHRhY2htZW50RGVsZXRlMTQgQXR0YWNobWVudERlbGV0ZTE1IEF0dGFjaG1lbnREZWxldGUxNgogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0MTQiKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHJpb3JpdHlSQyIpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRWxlbWVudENoYW5nZWQiKSB8fCAnJzsKCiAgICAjIHNldCBQcmlvcml0eVJDIGZyb20gY2hhbmdlZCBhamF4IGVsZW1lbnQKICAgIGlmICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnICkKICAgICAgICB8fCAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcgKSAmJiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gICkgKQogICAgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICAjIHNldCBzZXJ2aWNlIGlkIGZyb20gdGlja2V0CiAgICBpZiAoIWRlZmluZWQoJEdldFBhcmFte1NlcnZpY2VJRH0pICYmICRUaWNrZXR7U2VydmljZUlEfSkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9OwogICAgfQoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICk7CgogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFte0ltcGFjdElEfSkgewogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIEZSRUVUSU1FTlVNQkVSOgogICAgZm9yIG15ICRGcmVlVGltZU51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBjcmVhdGUgZnJlZXRpbWUgcHJlZml4CiAgICAgICAgbXkgJEZyZWVUaW1lUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRGcmVlVGltZU51bWJlcjsKCiAgICAgICAgIyBnZXQgZm9ybSBwYXJhbXMKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICRGcmVlVGltZVByZWZpeCAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVldGltZSBkYXRhIGZyb20gdGlja2V0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lU3RyaW5nID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGlja2V0eyRGcmVlVGltZVByZWZpeH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpY2tldEZyZWVUaW1lU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdEYXknIH0gICAgPSAkRGF5OwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgbXkgJEtleSAgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICBteSAkU2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSB8fCA3MDsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsJFNpemV9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBzdG9yZSBhY3Rpb24KICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHN0YXRlIHR5cGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGUgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3QgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0JvZHkgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskX30gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdBdHRhY2htZW50RGVsZXRlJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGV4cGFuZAogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7RXhwYW5kfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdGl0bGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHR5cGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgc2VydmljZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NMQUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IG93bmVyCiAgICAgICAgbXkgQE5vdGlmeURvbmU7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSBvd25lciB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSBvd25lciB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdPd25lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHJlc3BvbnNpYmxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSByZXNwb25zaWJsZSB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbm90ZQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGcm9tID0gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgbXkgQE5vdGlmeVVzZXJJRHMgPSAoIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9ICk7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFxATm90aWZ5VXNlcklEcywKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gXEBOb3RpZnlEb25lLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBza2lwIGRlbGV0ZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgbmV4dCBpZiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ID1+IC9eaW5saW5lLwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Qm9keX0gIX4gLyRBdHRhY2htZW50LT57Q29udGVudElEfS87CgogICAgICAgICAgICAgICAgIyB3cml0ZSBleGlzdGluZyBmaWxlIHRvIGJhY2tlbmQKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17JFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCgkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gMTMsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ID0+ICdJbXBhY3RJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0gfHwgJycsCiAgICAgICAgICAgIENvdW50ZXIgPT4gMTQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgICVUaW1lLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17JFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSAmJiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGxhc3Qgc2NyZWVuIG92ZXJ2aWV3IG9uIGNsb3NlZCB0aWNrZXRzCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSRTZWxmLT57VGlja2V0SUR9JkFydGljbGVJRD0kQXJ0aWNsZUlEIgogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKCiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBUaWNrZXRGcmVlVGV4dENvbmZpZyA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ29uZmlnVmFsdWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAgJFRpY2tldHtRdWV1ZUlEfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ1ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzZSB7CgogICAgICAgICMgZmlsbHVwIGNvbmZpZ3VyZWQgZGVmYXVsdCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17Qm9keX0gJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRWYWx1ZX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0sCiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQgPT4gJFRpY2tldHtQcmlvcml0eUlEfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICVTZXJ2aWNlID0gKCAnJywgJy0nICk7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICBPbkNoYW5nZSA9PgojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMCkiLAogICAgICAgICk7CiAgICAgICAgbXkgJVVzZXJIYXNoOwogICAgICAgIGlmIChAT2xkVXNlckluZm8pIHsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAxOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBPbGRVc2VySW5mbyApIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISVVc2VySGFzaCApIHsKICAgICAgICAgICAgJFVzZXJIYXNoeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T2xkT3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPbGRPd25lcklEJywKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDIpIiwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lckpzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9IHx8ICRUaWNrZXR7UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgIG15ICVTdGF0ZSAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRTdGF0ZUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3U3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICRQYXJhbXtTdGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRTdGF0ZUlEOwogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJFN0YXRlSUQgKTsKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAgICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtJbXBhY3RzfSwKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwojIC0tLQogICAgICAgIG15ICVQcmlvcml0eTsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlSnMnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZ2VudCBsaXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbmZvcm1Vc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5JbnZvbHZlZEFnZW50cyggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgICAgIG15ICRDb3VudGVyICA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZSA9ICgpOwogICAgICAgIGlmICggISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggUmVzdWx0ID0+ICdIQVNIJyApOwogICAgICAgIGZvciAoIGtleXMgJU5vdGVUeXBlcyApIHsKICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5vdGVUeXBlc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByaW9yaXR5JywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UmVzcG9uc2libGUucG0gLSBzZXQgdGlja2V0IHJlc3BvbnNpYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLnBtLHYgMS45IDIwMDkvMDkvMzAgMTc6NTM6MDUgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UmVzcG9uc2libGUucG0sdiAxLjU4LjIuMyAyMDA5LzA5LzMwIDE2OjE2OjUwIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRSZXNwb25zaWJsZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRpY2tldElEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSwKICAgICAgICApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBteSAkS2V5ICAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ0F0dGFjaG1lbnREZWxldGUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICBteSBATm90aWZ5VXNlcklEcyA9ICggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0gKTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gXEBOb3RpZnlVc2VySURzLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBcQE5vdGlmeURvbmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIHNraXAgZGVsZXRlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gPX4gL15pbmxpbmUvCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJEF0dGFjaG1lbnQtPntDb250ZW50SUR9LzsKCiAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskVmFsdWV9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgY29uZmlndXJlZCBkZWZhdWx0IHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtCb2R5fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVmFsdWV9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFZhbHVlfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2g7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgbmV4dCBpZiAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFN0YXRlSUQ7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclNwZWxsQ2hlY2tlcn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBSZXN1bHQgPT4gJ0hBU0gnICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFpvb20ucG0sdiAxLjggMjAwOS8wOS8zMCAxNzo1MzowNSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRab29tLnBtLHYgMS43NS4yLjQgMjAwOS8wOS8yOSAxMTo0Nzo0OCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QgU2Vzc2lvbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAjIGdldCBwYXJhbXMKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwogICAgJFNlbGYtPntab29tRXhwYW5kfSAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kJyApOwogICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kU29ydCcgKTsKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmQnKTsKICAgIH0KICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kU29ydH0gKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKTsKICAgIH0KICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRRdWV1ZScpOwogICAgaWYgKCRDb25maWcpIHsKICAgICAgICAkU2VsZi0+e0hpZ2hsaWdodENvbG9yMX0gPSAkQ29uZmlnLT57SGlnaGxpZ2h0Q29sb3IxfSB8fCAnb3JhbmdlJzsKICAgICAgICAkU2VsZi0+e0hpZ2hsaWdodENvbG9yMn0gPSAkQ29uZmlnLT57SGlnaGxpZ2h0Q29sb3IyfSB8fCAncmVkJzsKICAgIH0KICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaWNrZXRBcnRpY2xlRmlsdGVyJyk7CgogICAgIyBkZWZpbmUgaWYgcmljaCB0ZXh0IHNob3VsZCBiZSB1c2VkCiAgICAkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21SaWNoVGV4dEZvcmNlJykKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykKICAgICAgICB8fCAwOwoKICAgICMgdGlja2V0IGlkIGxvb2t1cAogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0TnVtYmVyJyApICkgewogICAgICAgICRTZWxmLT57VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBUaWNrZXRJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgd3JpdGUgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgdG8gc2Vzc2lvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FydGljbGVGaWx0ZXJTZXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICAgICAgbXkgJFNhdmVEZWZhdWx0cyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVEZWZhdWx0cycgKTsKICAgICAgICBteSBAQXJ0aWNsZVR5cGVGaWx0ZXJJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBcnRpY2xlVHlwZUZpbHRlcicgKTsKICAgICAgICBteSBAQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXJJRHMKICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcicgKTsKCiAgICAgICAgIyBidWlsZCBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRTZXNzaW9uU3RyaW5nID0gJyc7CiAgICAgICAgaWYgKEBBcnRpY2xlVHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnQXJ0aWNsZVR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBBcnRpY2xlVHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KICAgICAgICBpZiAoQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcjwnOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSBqb2luICcsJywgQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnPic7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIHRoZSBzZXNzaW9uCgogICAgICAgICMgc2F2ZSBkZWZhdWx0IGZpbHRlciBzZXR0aW5ncyB0byB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCRTYXZlRGVmYXVsdHMpIHsKICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICJBcnRpY2xlRmlsdGVyRGVmYXVsdCIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gIkFydGljbGVGaWx0ZXJEZWZhdWx0IiwKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgZmlsdGVyIGV4cGxpY2l0bHkgZm9yIHRoaXMgdGlja2V0CiAgICAgICAgaWYgKCAkU2Vzc2lvblN0cmluZyBlcSAnJyApIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgPSAnb2ZmJzsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzZXNzaW9uCiAgICAgICAgbXkgJFVwZGF0ZSA9ICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICJBcnRpY2xlRmlsdGVyJFRpY2tldElEIiwKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICcnOwogICAgICAgIGlmICgkVXBkYXRlKSB7CiAgICAgICAgICAgICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09OKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3Mgd2VyZSBzYXZlZC4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBuZSAnU2hvd0hUTUxlTWFpbCcgKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZwogICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJBY3RpdmV9ICkgewoKICAgICAgICAjIGdldCBhcnRpY2xlIGZpbHRlciBzZXR0aW5ncyBmcm9tIHNlc3Npb24gc3RyaW5nCiAgICAgICAgbXkgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPnsgIkFydGljbGVGaWx0ZXIiIC4gJFNlbGYtPntUaWNrZXRJRH0gfTsKCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmaWx0ZXIgZm9yIHRoaXMgdGlja2V0IGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyApIHsKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPntBcnRpY2xlRmlsdGVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGVmYXVsdHMgZm9yIHRoaXMgdGlja2V0IGlmIGZpbHRlciB3YXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmCiAgICAgICAgZWxzaWYgKCAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgZXEgJ29mZicgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IEFydGljbGVUeXBlSURzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcKICAgICAgICAgICAgJiYgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID1+IG17IEFydGljbGVUeXBlRmlsdGVyIDwgKCBbXjw+XSsgKSA+IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC8sLywgJDE7CiAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntBcnRpY2xlVHlwZUlEfSA9IHsgbWFwIHsgJF8gPT4gMSB9IEBJRHMgfTsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlU2VuZGVyVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2VuZGVyVHlwZUlEfSA9IHsgbWFwIHsgJF8gPT4gMSB9IEBJRHMgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBzdHJpcCBodG1sIGFuZCBhc2NpaSBhdHRhY2htZW50cyBvZiBjb250ZW50CiAgICBteSAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPSAxOwoKICAgICMgY2hlY2sgaWYgcmljaCB0ZXh0IGlzIGVuYWJsZWQsIGlmIG5vdCBvbmx5IHN0aXAgYXNjaWkgYXR0YWNobWVudHMKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9IDI7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgbG9va3VwIGNyaXRpY2FsaXR5CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9KSB7CiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eUxpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9fTsKICAgIH0KICAgICMgbG9va3VwIGltcGFjdAogICAgJFRpY2tldHtJbXBhY3R9ID0gJy0nOwogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0pIHsKICAgICAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7SW1wYWN0fSA9ICRJbXBhY3RMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCiAgICBteSBAQXJ0aWNsZUJveCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNvbnRlbnRJbmRleCgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQsCiAgICApOwoKICAgICMgcmV0dXJuIGlmIEhUTUwgZW1haWwKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTaG93SFRNTGVNYWlsJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgQXJ0aWNsZUlECiAgICAgICAgaWYgKCAhJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBBcnRpY2xlSUQhJyApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhCiAgICAgICAgbXkgJUFydGljbGUgPSAoKTsKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGVUbXAtPntBcnRpY2xlSUR9IGVxICRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBkYXRhIGV4aXN0cwogICAgICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnSW52YWxpZCBBcnRpY2xlSUQhJyApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBhIGh0bWwgZW1haWwsIHJldHVybiBoZXJlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SG9vaycpCiAgICAgICAgICAgICAgICAuICItJEFydGljbGV7VGlja2V0TnVtYmVyfS0kQXJ0aWNsZXtUaWNrZXRJRH0tJEFydGljbGV7QXJ0aWNsZUlEfSIsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiJEFydGljbGV7TWltZVR5cGV9OyBjaGFyc2V0PSRBcnRpY2xle0NoYXJzZXR9IiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGVsc2Ugc2hvdyBub3JtYWwgdGlja2V0IHpvb20gdmlldwogICAgIyBmZXRjaCBhbGwgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcwogICAgbXkgJVN0ZFJlc3BvbnNlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTdGRSZXNwb25zZXMoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICgpOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbScpICkgewogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUaWNrZXR7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzaG93IHRpY2tldAogICAgJE91dHB1dCAuPSAkU2VsZi0+TWFza0FnZW50Wm9vbSgKICAgICAgICBNb3ZlUXVldWVzICAgICAgPT4gXCVNb3ZlUXVldWVzLAogICAgICAgIFN0ZFJlc3BvbnNlcyAgICA9PiBcJVN0ZFJlc3BvbnNlcywKICAgICAgICBBcnRpY2xlQm94ICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgIEN1c3RvbWVyRGF0YSAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICBUaWNrZXRUaW1lVW5pdHMgPT4gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCVUaWNrZXQpLAogICAgICAgICVUaWNrZXQsCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBNYXNrQWdlbnRab29tIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvd25lciBpbmZvCiAgICBteSAlT3duZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtPd25lcklEfSwKICAgICAgICBDYWNoZWQgPT4gMQogICAgKTsKCiAgICAjIHJlc3BvbnNpYmxlIGluZm8KICAgIG15ICVSZXNwb25zaWJsZUluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlSUR9IHx8IDEsCiAgICAgICAgQ2FjaGVkID0+IDEKICAgICk7CgogICAgIyBnZXQgYWNrIGFjdGlvbnMKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgYWdlIGRlc2lnbgogICAgJFBhcmFte0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJFBhcmFte0FnZX0sIFNwYWNlID0+ICcgJyApOwogICAgaWYgKCAkUGFyYW17VW50aWxUaW1lfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtVbnRpbFRpbWV9IDwgLTEgJiYgJFNlbGYtPntIaWdobGlnaHRDb2xvcjJ9ICkgewogICAgICAgICAgICAkUGFyYW17UGVuZGluZ1VudGlsfSA9ICI8Zm9udCBjb2xvcj0nJFNlbGYtPntIaWdobGlnaHRDb2xvcjJ9Jz4iOwogICAgICAgIH0KICAgICAgICAkUGFyYW17UGVuZGluZ1VudGlsfSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJzxicj4nLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17VW50aWxUaW1lfSA8IC0xICYmICRTZWxmLT57SGlnaGxpZ2h0Q29sb3IyfSApIHsKICAgICAgICAgICAgJFBhcmFte1BlbmRpbmdVbnRpbH0gLj0gIjwvZm9udD4iOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSGVhZGVyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICApOwoKICAgICMgcnVuIHRpY2tldCBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LCApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgIEFDTCAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIEtleSAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHRhYmxlIHZpZXcgbW9kZQogICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICk7CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkQmFzZUxpbmsgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICJUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSYiOwogICAgbXkgQEFydGljbGVCb3ggPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKCiAgICAjIGdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIG15ICRDb3VudGVyQXJyYXkgPSAwOwogICAgbXkgJEFydGljbGVJRDsKICAgIGlmICggJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e0FydGljbGVJRH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzZXQgZmlyc3QgYXJ0aWNsZQogICAgICAgIGlmIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGVCb3hbMF0tPntBcnRpY2xlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlVG1wLT57U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZVRtcC0+e0FydGljbGVJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZW1lbWJlciBzaG93biBhcnRpY2xlIGlkcyBpZiBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKCiAgICAgICAgIyByZXNldCBzaG93biBhcnRpY2xlIGlkcwogICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9ID0gdW5kZWY7CgogICAgICAgIG15ICROZXdBcnRpY2xlSUQgPSAnJzsKICAgICAgICBteSAkQ291bnQgICAgICAgID0gMDsKCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAjIGFydGljbGUgdHlwZSBpZCBkb2VzIG5vdCBtYXRjaAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0KICAgICAgICAgICAgICAgICYmICEkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0tPnsgJEFydGljbGUtPntBcnRpY2xlVHlwZUlEfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcnRpY2xlIHNlbmRlciB0eXBlIGlkIGRvZXMgbm90IG1hdGNoCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICAmJiAhJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1NlbmRlclR5cGVJRH0tPnsgJEFydGljbGUtPntTZW5kZXJUeXBlSUR9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBUlRJQ0xFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvdW50IHNob3duIGFydGljbGVzCiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgIyByZW1lbWJlciBhcnRpY2xlIGlkCiAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSB9ID0gMTsKCiAgICAgICAgICAgICMgc2V0IGFydGljbGUgaWQgdG8gZmlyc3Qgc2hvd24gYXJ0aWNsZQogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICkgewogICAgICAgICAgICAgICAgJE5ld0FydGljbGVJRCA9ICRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYXJ0aWNsZSBpZCB0byBsYXN0IHNob3duIGN1c3RvbWVyIGFydGljbGUKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAkTmV3QXJ0aWNsZUlEID0gJEFydGljbGUtPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoYW5nZSBhcnRpY2xlIGlkIGlmIGl0IHdhcyBmaWx0ZXJlZCBvdXQKICAgICAgICBpZiAoICROZXdBcnRpY2xlSUQgJiYgISRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57JEFydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkTmV3QXJ0aWNsZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY3VycmVudCBhcnRpY2xlIGlkCiAgICAgICAgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30tPnskQXJ0aWNsZUlEfSA9IDE7CiAgICB9CgogICAgIyBidWlsZCB0aHJlYWQgc3RyaW5nCiAgICBteSAkQ291bnRlciAgICAgICAgPSAnJzsKICAgIG15ICRTcGFjZSAgICAgICAgICA9ICcnOwogICAgbXkgJExhc3RTZW5kZXJUeXBlID0gJyc7CgogICAgIyBjaGVjayBpZiBleHBhbmQgdmlldyBpcyB1c2FibGUgKG9ubHkgZm9yIGxlc3MgdGhlbiA0MDAgYXJ0aWNsZSkKICAgICMgaWYgeW91IGhhdmUgbW9yZSBhcnRpY2xlcyBpcyBnb2luZyB0byBiZSBzbG93IGFuZCBub3QgdXNhYmxlCiAgICBteSAkQXJ0aWNsZU1heExpbWl0ID0gNDAwOwogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICQjQXJ0aWNsZUJveCA+ICRBcnRpY2xlTWF4TGltaXQgKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9IDA7CiAgICB9CgogICAgIyBnZXQgc2hvd24gYXJ0aWNsZShzKQogICAgbXkgQE5ld0FydGljbGVCb3ggPSAoKTsKICAgIGlmICggISRTZWxmLT57Wm9vbUV4cGFuZH0gKSB7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGVUbXAtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBATmV3QXJ0aWNsZUJveCwgJEFydGljbGVUbXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBATmV3QXJ0aWNsZUJveCA9IEBBcnRpY2xlQm94OwogICAgfQoKICAgICMgcmVzb3J0IGFydGljbGUgb3JkZXIKICAgIGlmICggJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBBcnRpY2xlQm94ICAgID0gcmV2ZXJzZSBAQXJ0aWNsZUJveDsKICAgICAgICBATmV3QXJ0aWNsZUJveCA9IHJldmVyc2UgQE5ld0FydGljbGVCb3g7CiAgICB9CgogICAgIyBidWlsZCBzaG93biBhcnRpY2xlKHMpCiAgICBteSAkQ291bnQgICAgICA9IDA7CiAgICBteSAkQm9keU91dHB1dCA9ICcnOwogICAgQVJUSUNMRToKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQE5ld0FydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKCiAgICAgICAgIyAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcgYW5kIHRoZXJlIGFyZSBhcnRpY2xlcyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJBY3RpdmV9CiAgICAgICAgICAgICYmICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0KICAgICAgICAgICAgJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZG8gbm90IHNob3cgYXJ0aWNsZSBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsdGVyCiAgICAgICAgICAgIGlmICggISRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57ICRBcnRpY2xle0FydGljbGVJRH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjb3VudCBzaG93biBhcnRpY2xlcwogICAgICAgICRDb3VudCsrOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCb2R5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGJvZHkgYXMgaHRtbCBvciBwbGFpbiB0ZXh0CiAgICAgICAgbXkgJFZpZXdNb2RlID0gJ0JvZHlIVE1MJzsKCiAgICAgICAgIyBpbiBjYXNlIHNob3cgcGxhaW4gYXJ0aWNsZSBib2R5IChpZiBubyBodG1sIGJvZHkgYXMgYXR0YWNobWVudCBleGlzdHMgb2YgaWYgcmljaAogICAgICAgICMgdGV4dCBpcyBub3QgZW5hYmxlZCkKICAgICAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSB8fCAhJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgICAgICRWaWV3TW9kZSA9ICdCb2R5UGxhaW4nOwoKICAgICAgICAgICAgIyByZW1lbWJlciBwbGFpbiBib2R5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgQXJ0aWNsZVZpZXdNb2R1bGVzCiAgICAgICAgICAgICRBcnRpY2xle0JvZHlQbGFpbn0gPSAkQXJ0aWNsZXtCb2R5fTsKCiAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpLAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gY2hhcnNldCBjaGVjawogICAgICAgICAgICBpZiAoIG15ICRDaGFyc2V0VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tDaGFyc2V0KCAlUGFyYW0sICVBcnRpY2xlICkgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtCb2R5Tm90ZX0gPSAkQ2hhcnNldFRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBib2R5CiAgICAgICAgIyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYW4gYW5vbnltb3VzIGNvcHkgb2YgJUFydGljbGUgYW5kIHBhc3MgaXQgdG8KICAgICAgICAjIHRoZSBMYXlvdXRPYmplY3QsIGJlY2F1c2UgJUFydGljbGUgbWF5IGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkVmlld01vZGUsCiAgICAgICAgICAgIERhdGEgPT4geyVBcnRpY2xlfSwKICAgICAgICApOwoKICAgICAgICAjIHJlc3RvcmUgcGxhaW4gYm9keSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IEFydGljbGVWaWV3TW9kdWxlcwogICAgICAgIGlmICggISRTZWxmLT57UmljaFRleHR9IHx8ICEkQXJ0aWNsZXtBdHRhY2htZW50SURPZkhUTUxCb2R5fSApIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkQXJ0aWNsZXtCb2R5UGxhaW59OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFydGljbGUgdHJlZQogICAgICAgIGlmICggJENvdW50ID09IDEgKSB7CgogICAgICAgICAgICAjIHNob3cgc3RhdHVzIGluZm8KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXR1cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCB0eXBlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRQYXJhbXtTZXJ2aWNlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1NMQX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICAgICAgICAgIEFnZSAgID0+ICRQYXJhbXsnRmlyc3RSZXNwb25zZVRpbWUnfSwKICAgICAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgICAgICAgICAgQWdlICAgPT4gJFBhcmFteydGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lJ30sCiAgICAgICAgICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHVwZGF0ZSB0aW1lIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1VwZGF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VwZGF0ZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17J1VwZGF0ZVRpbWUnfSwKICAgICAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17J1VwZGF0ZVRpbWVXb3JraW5nVGltZSd9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFBhcmFte1VwZGF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lRm9udFN0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IHNvbHV0aW9uIHRpbWUgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTb2x1dGlvblRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17J1NvbHV0aW9uVGltZSd9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17U29sdXRpb25UaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgICAgICAgICAgQWdlICAgPT4gJFBhcmFteydTb2x1dGlvblRpbWVXb3JraW5nVGltZSd9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkUGFyYW17U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWVGb250U3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb20nKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgICAgICAgICBEYXRhICAgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTWF4ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9ab29tTWF4U2l6ZScpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJU93bmVySW5mbywgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlUmVzcG9uc2libGVJbmZvLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCB0aGUgc2ltcGxlIGxpbmsgdGFibGUKICAgICAgICAgICAgaWYgKCAkTGlua1RhYmxlU3RyZyAmJiAkTGlua1RhYmxlVmlld01vZGUgZXEgJ1NpbXBsZScgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZVNpbXBsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBDT1VOVDoKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBuZXh0IENPVU5UIGlmICggKCRDb3VudCA+PSAxMykgJiYgKCRDb3VudCA8PSAxNikgKTsKIyAtLS0KICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgLiAnOjpMaW5rJyApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRQbGFpbicgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dFBsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRMaW5rJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRMaW5rID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIHRocmVhZCBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZwogICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaGlnaGxpZ2h0IHN0eWxlIGZvciBsaW5rcyBpZiBmaWx0ZXIgaXMgYWN0aXZlCiAgICAgICAgICAgICAgICBteSAkSGlnaGxpZ2h0U3R5bGUgPSAnbWVudSc7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpZ2hsaWdodFN0eWxlID0gJ1ByaW9yaXR5SUQtNSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBhcnRpY2xlIGZpbHRlciBsaW5rcwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nTGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSGlnaGxpZ2h0U3R5bGUgPT4gJEhpZ2hsaWdodFN0eWxlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgYXJ0aWNsZSBmaWx0ZXIgcmVzZXQgbGluayBvbmx5IGlmIGZpbHRlciBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyUmVzZXRMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlclRyZWUgICAgPSAwOwogICAgICAgICAgICBteSAkQ291bnRlciAgICAgICAgPSAnJzsKICAgICAgICAgICAgbXkgJFNwYWNlICAgICAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwoKICAgICAgICAgICAgVFJFRUFSVElDTEU6CiAgICAgICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0ICAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRTdG9wICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkU3RhcnQyICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJFN0b3AyICAgPSAnJzsKICAgICAgICAgICAgICAgICRDb3VudGVyVHJlZSsrOwogICAgICAgICAgICAgICAgbXkgJFRtcFN1YmplY3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJExhc3RTZW5kZXJUeXBlIG5lICRBcnRpY2xle1NlbmRlclR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICRDb3VudGVyIC49ICImbmJzcDsiOwogICAgICAgICAgICAgICAgICAgICRTcGFjZSA9ICIkQ291bnRlciZuYnNwO3wtLSZndDsiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJExhc3RTZW5kZXJUeXBlID0gJEFydGljbGV7U2VuZGVyVHlwZX07CgogICAgICAgICAgICAgICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnIGFuZCB0aGVyZSBhcmUgYXJ0aWNsZXMKICAgICAgICAgICAgICAgICMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0KICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9CiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgYXJ0aWNsZSBpbiB0cmVlIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2hvd25BcnRpY2xlSURzfS0+eyAkQXJ0aWNsZXtBcnRpY2xlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVFJFRUFSVElDTEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gYWRkIDxpPjx1PiBhbmQgPGI+CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkU3RhcnQgID0gJzxpPjx1Pic7CiAgICAgICAgICAgICAgICAgICAgJFN0b3AgICA9ICc8L3U+PC9pPic7CiAgICAgICAgICAgICAgICAgICAgJFN0YXJ0MiA9ICc8Yj4nOwogICAgICAgICAgICAgICAgICAgICRTdG9wMiAgPSAnPC9iPic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgYWxzbyBleHBhbmQvY29sbGFwc2UgaWNvbgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkVG1wU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgU3BhY2UgICAgICAgICAgPT4gJFNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgICAgICA9PiAkU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3AgICAgICAgICAgID0+ICRTdG9wLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydDIgICAgICAgICA9PiAkU3RhcnQyLAogICAgICAgICAgICAgICAgICAgICAgICBTdG9wMiAgICAgICAgICA9PiAkU3RvcDIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudGVyVHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgWm9vbUV4cGFuZCAgICAgPT4gJFNlbGYtPntab29tRXhwYW5kfSwKICAgICAgICAgICAgICAgICAgICAgICAgWm9vbUV4cGFuZFNvcnQgPT4gJFNlbGYtPntab29tRXhwYW5kU29ydH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IHBsYWluIGxpbmsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGxhaW5WaWV3JykKICAgICAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gL15lbWFpbC8KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1FbWFpbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlQXJ0aWNsZSwgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIGF0dGFjaG1lbnQgaWNvbnMKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZXtBdG1zfQogICAgICAgICAgICAgICAgICAgICYmICV7ICRBcnRpY2xle0F0bXN9IH0KICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXknKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyBkb3dubG9hZCB0eXBlCiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICdhdHRhY2htZW50JzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZiBhdHRhY2htZW50IHdpbGwgYmUgZm9yY2VkIHRvIGRvd25sb2FkLCBkb24ndCBvcGVuIGEgbmV3IGRvd25sb2FkIHdpbmRvdyEKICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvaW5saW5lL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkWm9vbUF0dGFjaG1lbnREaXNwbGF5Q291bnQKICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXlDb3VudCcpOwogICAgICAgICAgICAgICAgICAgIG15ICRDb3VudFNob3duID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAoICRab29tQXR0YWNobWVudERpc3BsYXlDb3VudCArIDIgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAhJEFydGljbGV7QXRtc30tPnskQ291bnR9OwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRTaG93bisrOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IG1vcmUgbG9nbwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudFNob3duID4gJFpvb21BdHRhY2htZW50RGlzcGxheUNvdW50ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUF0dGFjaG1lbnRNb3JlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JENvdW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQgPT4gJFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyBhdHRhY2htZW50IGxvZ28KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZXhwYW5kL2NvbGxhcHNlIHZpZXcgaXMgdXNhYmxlIChvbmx5IGZvciBsZXNzIHRoZW4gMzAwIGFydGljbGVzKQogICAgICAgIGlmICggJENvdW50ID09IDEgJiYgJCNBcnRpY2xlQm94IDwgJEFydGljbGVNYXhMaW1pdCApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDb2xsYXBzZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwYW5kJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgICAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKSApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJSb3ciLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjayggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbHRlciBvcHRpb24KICAgICAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHRoZSBjb21wbGV4IGxpbmsgdGFibGUKICAgICAgICBpZiAoCiAgICAgICAgICAgICRMaW5rVGFibGVTdHJnCiAgICAgICAgICAgICYmICRMaW5rVGFibGVWaWV3TW9kZSBlcSAnQ29tcGxleCcKICAgICAgICAgICAgJiYgJEFydGljbGVUbXAgZXEgJE5ld0FydGljbGVCb3hbLTFdCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGVDb21wbGV4JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgU3RkUmVzcG9uc2VzU3RyZwogICAgICAgICRQYXJhbXtTdGRSZXNwb25zZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0U3RkUmVzcG9uc2VTdHJpbmcoCiAgICAgICAgICAgIFN0ZFJlc3BvbnNlc1JlZiA9PiAkUGFyYW17U3RkUmVzcG9uc2VzfSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKCiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBibG9jayBmb3IgYXR0YWNobWVudHMKICAgICAgICBpZiAoJUF0bUluZGV4KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgS2V5ID0+ICdBdHRhY2htZW50JywgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVGaWxlLCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gYXJ0aWNsZSBhdHRhY2htZW50IG1vZHVsZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQXR0YWNobWVudE1vZHVsZScpIGVxCiAgICAgICAgICAgICAgICAnSEFTSCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUpvYnMKICAgICAgICAgICAgICAgICAgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQXR0YWNobWVudE1vZHVsZScpIH07CiAgICAgICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlID0+IHsgJUZpbGUsIEZpbGVJRCA9PiAkRmlsZUlELCB9LAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICglRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRGF0YXtCbG9ja30gfHwgJ0FydGljbGVBdHRhY2htZW50Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNlbGVjdCB0aGUgb3V0cHV0IHRlbXBsYXRlCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gL15ub3RlL2kgKSB7CgogICAgICAgICAgICAjIHdpdGhvdXQgY29tcG9zZSBsaW5rcyEKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QXJ0aWNsZUNvbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBwcmludCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQcmludH0KICAgICAgICAgICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFByaW50fSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UHJpbnR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJE9LKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tUHJpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyB3aXRob3V0IGFsbCEKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSIpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgcGhvbmUgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kIik7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHByaW50IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFByaW50fQogICAgICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UHJpbnR9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQcmludH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkT0spIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFydGljbGVDb21QcmludCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBmb3J3YXJkIGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEZvcndhcmR9CiAgICAgICAgICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRGb3J3YXJkfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Rm9yd2FyZH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGb3J3YXJkIik7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gKSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tRm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBib3VuY2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Qm91bmNlfQogICAgICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEJvdW5jZSIpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9ICkgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QXJ0aWNsZUNvbUJvdW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBzcGxpdCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZX0KICAgICAgICAgICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmV9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFydGljbGVDb21QaG9uZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgTW92ZVF1ZXVlc1N0cmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1vdmVUeXBlJykgPX4gL15mb3JtJC9pICkgewogICAgICAgICRQYXJhbXtNb3ZlUXVldWVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0UXVldWVJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte01vdmVRdWV1ZXN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICApOwogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldE1vdmV9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldE1vdmV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTW92ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGb290ZXInLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgICMgZ2V0IGFydGljbGUgdHlwZXMKICAgICAgICBteSAlQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhcnRpY2xlIHR5cGUgbGlzdCBmb3IgZmlsdGVyIGRpYWxvZwogICAgICAgICRQYXJhbXsnQXJ0aWNsZVR5cGVGaWx0ZXJTdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlQXJ0aWNsZVR5cGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBbIGtleXMgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e0FydGljbGVUeXBlSUR9IH0gXSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FydGljbGVUeXBlRmlsdGVyJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZW5kZXIgdHlwZXMKICAgICAgICBteSAlQXJ0aWNsZVNlbmRlclR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZGVyVHlwZUxpc3QoCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhcnRpY2xlIHNlbmRlciB0eXBlIGxpc3QgZm9yIGZpbHRlciBkaWFsb2cKICAgICAgICAkUGFyYW17J0FydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJUFydGljbGVTZW5kZXJUeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gWyBrZXlzICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTZW5kZXJUeXBlSUR9IH0gXSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FydGljbGVTZW5kZXJUeXBlRmlsdGVyJywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRQcmludC5wbSx2IDEuMyAyMDA5LzA4LzI4IDExOjQwOjAzIG1oIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LnBtLHYgMS4yNyAyMDA5LzA4LzI3IDE2OjAwOjIzIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQ7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yKCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgIH0KICAgICRRdWV1ZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRRdWV1ZUlEKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5DdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfSkgewogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfX07CiAgICB9CiAgICAjIGxvb2t1cCBpbXBhY3QKICAgICRUaWNrZXR7SW1wYWN0fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQogICAgbXkgQEN1c3RvbWVyQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgPT4gXEBDdXN0b21lckFydGljbGVUeXBlcywKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAxLAogICAgKTsKICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFRpY2tldHtDdXN0b21lcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJFRpY2tldHtBZ2V9LCBTcGFjZSA9PiAnICcgKTsKICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9ICkgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAnLSc7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAkUHJpbnRlZEJ5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3ByaW50ZWQgYnknKTsKICAgICAgICBteSAkVGltZSAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgbXkgJFVybCAgICAgICA9ICcgJzsKICAgICAgICBpZiAoICRFTlZ7UkVRVUVTVF9VUkl9ICkgewogICAgICAgICAgICAkVXJsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KICAgICAgICBteSAlUGFnZTsKCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgbXkgJEhlYWRlclJpZ2h0ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSApIHsKICAgICAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gPSAkSGVhZGxpbmVMZWZ0OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9CiAgICAgICAgICAgID0gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRUaW1lOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJFVybDsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRJbmZvcygKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGZyZWV0ZXh0IGZpZWxkcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RnJlZVRleHQoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZSBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEZyZWVUaW1lKAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0Q3VzdG9tZXJJbmZvcygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhcnRpY2xlcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXJ0aWNsZXMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgQXJ0aWNsZURhdGEgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICBteSAkRmlsZW5hbWUgPSAnVGlja2V0XycgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CiAgICAgICAgbXkgJFBERlN0cmluZyA9ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIGh0bWwgb3V0cHV0CiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgTWF4ICA9PiAxMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGlja2V0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0hUTUxNYXNrKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBcnRpY2xlQm94ID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICAjIHJldHVybiBvdXRwdXQKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRUaWNrZXRJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7U3RhdGV9ICksCiAgICAgICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIHsKIyAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQcmlvcml0eScpIC4gJzonLAojICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7UHJpb3JpdHl9ICksCiMgICAgICAgIH0sCiMgLS0tCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUXVldWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtRdWV1ZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMb2NrJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0xvY2t9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXN0b21lcklEJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1R5cGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIGFuZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgIG15ICRSb3dTZXJ2aWNlID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZpY2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U2VydmljZSApOwogICAgICAgIG15ICRSb3dTTEEgPSB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U0xBfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U0xBICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgJFRhYmxlTGVmdEV4dGVuZGVkID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcml0aWNhbGl0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0NyaXRpY2FsaXR5fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW1wYWN0JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7SW1wYWN0fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJpb3JpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtQcmlvcml0eX0pLAogICAgICAgIH0sCiAgICBdOwogICAgcHVzaChAeyRUYWJsZUxlZnR9LCBAeyRUYWJsZUxlZnRFeHRlbmRlZH0pOwojIC0tLQoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBZ2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7QWdlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FjY291bnRlZCB0aW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BlbmRpbmcgdGlsbCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1BlbmRpbmdVbnRpbH0sCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRleHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yICggMSAuLiAxNiApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBkaXNhYmxlIHRpY2tldCBmcmVlIHRleHQgMTMgYW5kIDE0CiAgICAgICAgaWYgKCRfIGVxIDEzIHx8ICRfIGVxIDE0KSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJFRpY2tldHsiVGlja2V0RnJlZVRleHQkXyJ9IG5lICIiICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGlja2V0eyJUaWNrZXRGcmVlS2V5JF8ifSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGlja2V0eyJUaWNrZXRGcmVlVGV4dCRfIn07CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dAogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRleHQnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFRpY2tldHsiVGlja2V0RnJlZVRpbWUkXyJ9ICkgewogICAgICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVLZXkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRfICkgfHwgJyc7CiAgICAgICAgICAgIG15ICRUaWNrZXRGcmVlVGltZSA9ICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJF8ifTsKCiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRUaWNrZXRGcmVlVGltZUtleSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJUaWNrZXRGcmVlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRpY2tldEZyZWVUaW1lID0+ICRUaWNrZXRGcmVlVGltZSwgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgJE91dHB1dCA9IDE7CiAgICAgICAgfQogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBvdXRwdXQgdGlja2V0IGZyZWV0aW1lCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaWNrZXRGcmVlVGltZScpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgQ3VzdG9tZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXN0b21lciBJbmZvcycpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRBcnRpY2xlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIEFydGljbGVEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVBhZ2UgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJEZpcnN0QXJ0aWNsZSA9IDE7CiAgICBmb3IgbXkgJEFydGljbGVUbXAgKCBAeyAkUGFyYW17QXJ0aWNsZURhdGF9IH0gKSB7CiAgICAgICAgaWYgKCRGaXJzdEFydGljbGUpIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQXJ0aWNsZXMnKSwKICAgICAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpcnN0QXJ0aWNsZSA9IDA7CiAgICAgICAgfQoKICAgICAgICBteSAlQXJ0aWNsZSA9ICV7JEFydGljbGVUbXB9OwoKICAgICAgICAjIGdldCBhdHRhY2htZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgIG15ICRBdHRhY2htZW50czsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkQXR0YWNobWVudHMgLj0gJEZpbGV7RmlsZW5hbWV9IC4gJyAoJyAuICRGaWxle0ZpbGVzaXplfSAuICIpXG4iOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBhcnRpY2xlIGluZm8gdGFibGUKICAgICAgICBteSAlVGFibGVQYXJhbTE7CiAgICAgICAgbXkgJFJvdyA9IDA7CiAgICAgICAgZm9yIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJF8pIC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXskX307CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICApOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2J5Jyk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAuPSAnICcgLiAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKICAgICAgICAkUm93Kys7CiAgICAgICAgZm9yICggMSAuLiAzICkgewoKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9IC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifTsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7QXJ0aWNsZVR5cGV9OwogICAgICAgICRSb3crKzsKCiAgICAgICAgaWYgKCRBdHRhY2htZW50cykgewogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50JykgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgIGNob21wKCRBdHRhY2htZW50cyk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXR0YWNobWVudHM7CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBpbmZvcykKICAgICAgICAkVGFibGVQYXJhbTF7VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTF7Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGluZm9zKQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA4OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA4OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMiA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMiwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMntTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxNYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgdHlwZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZpY2UgYW5kIHNsYSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgICAgICAgICBTTEEgICAgID0+ICRQYXJhbXtTTEF9ICAgICB8fCAnLScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoJENvdW50IGVxIDEzIHx8ICRDb3VudCBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSBAQXJ0aWNsZUJveCA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfSA9ICcnOwogICAgICAgIGZvciBteSAkRmlsZUlEICgga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRGaWxle0ZpbGVuYW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsZXtGaWxlbmFtZX0gKTsKICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfQogICAgICAgICAgICAgICAgLj0gJzxhIGhyZWY9IiRFbnZ7IkNHSUhhbmRsZSJ9LyRRRGF0YXsiRmlsZW5hbWUifT9BY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50JicKICAgICAgICAgICAgICAgIC4gIkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9JkZpbGVJRD0kRmlsZUlEXCIgdGFyZ2V0PVwiYXR0YWNobWVudFwiICIKICAgICAgICAgICAgICAgIC4gIm9ubW91c2VvdmVyPVwid2luZG93LnN0YXR1cz0nXCRUZXh0e1wiRG93bmxvYWRcIn06ICRGaWxle0ZpbGVuYW1lfSc7IgogICAgICAgICAgICAgICAgLiAnIHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz1cJ1wnOyI+JwogICAgICAgICAgICAgICAgLiAiJEZpbGV7RmlsZW5hbWV9PC9hPiAkRmlsZXtGaWxlc2l6ZX08YnI+IjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgICAgIG15ICRNaW1lVHlwZVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrTWltZVR5cGUoCiAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICApOwogICAgICAgIGlmICgkTWltZVR5cGVUZXh0KSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSAgID0gJyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gY2hhcnNldCBjaGVjawogICAgICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDaGFyc2V0VGV4dCkgewogICAgICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpUZXh0Tm90ZSd9ID0gJENoYXJzZXRUZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CgogICAgICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRffSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFjY291bnRlZCBhcnRpY2xlIHRpbWUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21UaW1lRGlzcGxheScpICkgewogICAgICAgICAgICBteSAkQXJ0aWNsZVRpbWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFpvb20ucG0sdiAxLjEwIDIwMTAvMDEvMjAgMTM6NTM6NTAgdWIgRXhwICQKIyAkT2xkSWQ6IEN1c3RvbWVyVGlja2V0Wm9vbS5wbSx2IDEuNDguMi4xIDIwMDkvMTIvMDggMTU6MjM6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QKICAgICAgICBDb25maWdPYmplY3QgVXNlck9iamVjdCBTZXNzaW9uT2JqZWN0CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGFydGljbGUgaWQKICAgICRTZWxmLT57QXJ0aWNsZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKTsKCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJFcnJvciggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gbmUgJ1Nob3dIVE1MZU1haWwnICkgewogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICMgZ2V0IHBhcmFtcwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBTdWJqZWN0IEJvZHkgU3RhdGVJRCBQcmlvcml0eUlECiAgICAgICAgQXR0YWNobWVudFVwbG9hZAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJy0nOwoKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9KSB7CgogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CgogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQoKICAgICMgbG9va3VwIGltcGFjdAogICAgJFRpY2tldHtJbXBhY3R9ID0gJy0nOwoKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CgogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CgogICAgICAgICRUaWNrZXR7SW1wYWN0fSA9ICRJbXBhY3RMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCgogICAgIyBjaGVjayBmb2xsb3cgdXAKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e05leHRTY3JlZW59IHx8ICRTZWxmLT57Q29uZmlnfS0+e05leHRTY3JlZW5BZnRlckZvbGxvd1VwfTsKICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9CiAgICAgICAgICAgICAgICA9fiBzLyhePi4rfC57NCwkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyl9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9sbG93IHVwIG9wdGlvbiAocG9zc2libGUgb3Igbm90KQogICAgICAgIG15ICRGb2xsb3dVcFBvc3NpYmxlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEZvbGxvd1VwT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbG9jayBvcHRpb24gKHNob3VsZCBiZSB0aGUgdGlja2V0IGxvY2tlZCAtIGlmIGNsb3NlZCAtIGFmdGVyIHRoZSBmb2xsb3cgdXApCiAgICAgICAgbXkgJExvY2sgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sICk7CgogICAgICAgICMgZ2V0IHRpY2tldCBzdGF0ZSBkZXRhaWxzCiAgICAgICAgbXkgJVN0YXRlID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkRm9sbG93VXBQb3NzaWJsZSA9fiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJXYXJuaW5nKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHJlb3BlbiB0aWNrZXQsIG5vdCBwb3NzaWJsZSBpbiB0aGlzIHF1ZXVlIScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdDcmVhdGUgYSBuZXcgdGlja2V0IScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgPX4gcy8oXj4uK3wuezQsJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpfSkoPzpcc3xceikvJDFcbi9nbTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDEwICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJUVycm9yICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jayBpZiB0aWNrZXQgd2FzIGNsb3NlZAogICAgICAgICAgICBpZiAoICRMb2NrICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICYmICRUaWNrZXR7T3duZXJJRH0gbmUgJzEnICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiI7CgogICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgT3JpZ0hlYWRlciAgPT4gewogICAgICAgICAgICAgICAgICAgIEZyb20gICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgVG8gICAgICA9PiAnU3lzdGVtJywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHQyQXNjaWkoIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIGZvbGxvdyB1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQXJ0aWNsZUlEKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICAgICAgICAgIG15ICVOZXh0U3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17U3RhdGVJRH0gKTsKICAgICAgICAgICAgICAgIG15ICROZXh0U3RhdGUgPSAkTmV4dFN0YXRlRGF0YXtOYW1lfQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0KICAgICAgICAgICAgICAgICAgICB8fCAnb3Blbic7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgICAgIHB1c2goIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZiApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIFdSSVRFQVRUQUNITUVOVDoKICAgICAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBza2lwIGRlbGV0ZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgICAgIG5leHQgV1JJVEVBVFRBQ0hNRU5UIGlmICRSZWYtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkUmVmLT57Q29udGVudElEfSA9fiAvXmlubGluZS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtCb2R5fSAhfiAvJFJlZi0+e0NvbnRlbnRJRH0vOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskUmVmfSwKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gdmlldwogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbiZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckVycm9yKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUaWNrZXR7VG1wQ291bnRlcn0gICAgICA9IDA7CiAgICAkVGlja2V0e1RpY2tldFRpbWVVbml0c30gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwoKICAgICMgc2V0IHByaW9yaXR5IGZyb20gdGlja2V0IGFzIGZhbGxiYWNrCiAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gfHw9ICRUaWNrZXR7UHJpb3JpdHlJRH07CgogICAgIyBzdHJpcCBodG1sIGFuZCBhc2NpaSBhdHRhY2htZW50cyBvZiBjb250ZW50CiAgICBteSAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPSAxOwoKICAgICMgY2hlY2sgaWYgcmljaCB0ZXh0IGlzIGVuYWJsZWQsIGlmIG5vdCBvbmx5IHN0aXAgYXNjaWkgYXR0YWNobWVudHMKICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPSAyOwogICAgfQoKICAgICMgZ2V0IGFsbCBhcnRpY2xlIG9mIHRoaXMgdGlja2V0CiAgICBteSBAQ3VzdG9tZXJBcnRpY2xlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggVHlwZSA9PiAnQ3VzdG9tZXInICk7CiAgICBteSBAQXJ0aWNsZUJveCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNvbnRlbnRJbmRleCgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlVHlwZSAgICAgICAgICAgICAgICA9PiBcQEN1c3RvbWVyQXJ0aWNsZVR5cGVzLAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+ICRTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHNob3cgdGlja2V0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgaWYgaXQgaXMgYSBodG1sIGVtYWlsLCBkcm9wIG5vcm1hbCBoZWFkZXIKICAgICAgICAkVGlja2V0e1Nob3dIVE1MZU1haWx9ID0gMTsKICAgICAgICAkT3V0cHV0ID0gJyc7CiAgICB9CiAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgIEFydGljbGVJRCAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICVUaWNrZXQsCiAgICAgICAgJUdldFBhcmFtLAogICAgKTsKCiAgICAjIHJldHVybiBpZiBIVE1MIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgaWYgaXQgaXMgYSBodG1sIGVtYWlsLCByZXR1cm4gaGVyZQogICAgICAgICRUaWNrZXR7U2hvd0hUTUxlTWFpbH0gPSAxOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFBhcmFte0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJFBhcmFte0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSAkQmFzZUxpbmsgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30gLiAiVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mIjsKICAgIG15IEBBcnRpY2xlQm94ICAgICAgICA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhQEFydGljbGVCb3ggKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ25vJyApOwogICAgfQoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJENvdW50ZXJBcnJheSA9IDA7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgbXkgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CgogICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAjIGlmIGl0IGlzIGEgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgJExhc3RDdXN0b21lckFydGljbGVJRCA9ICRBcnRpY2xle0FydGljbGVJRH07CiAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlICAgPSAkQ291bnRlckFycmF5OwogICAgICAgIH0KICAgICAgICAkQ291bnRlckFycmF5Kys7CiAgICAgICAgaWYgKCAkU2VsZWN0ZWRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xle0FydGljbGVJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgdHJ5IHRvIHVzZSB0aGUgbGF0ZXN0IG5vbiBpbnRlcm5hbCBhZ2VudCBhcnRpY2xlCiAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJveFstMV0tPntBcnRpY2xlSUR9OwogICAgfQoKICAgICMgdHJ5IHRvIHVzZSB0aGUgbGF0ZXN0IGN1c3RvbWVyIGFydGljbGUKICAgIGlmICggISRBcnRpY2xlSUQgJiYgJExhc3RDdXN0b21lckFydGljbGVJRCApIHsKICAgICAgICAkQXJ0aWNsZUlEID0gJExhc3RDdXN0b21lckFydGljbGVJRDsKICAgIH0KCiAgICAjIGJ1aWxkIHRocmVhZCBzdHJpbmcKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVHJlZScsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CiAgICBteSAkQ291bnRlclRyZWUgICAgPSAwOwogICAgbXkgJENvdW50ZXIgICAgICAgID0gJyc7CiAgICBteSAkU3BhY2UgICAgICAgICAgPSAnJzsKICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwogICAgJFBhcmFte0FydGljbGVTdHJnfSA9ICcnOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwogICAgICAgIG15ICRTdGFydCAgID0gJyc7CiAgICAgICAgbXkgJFN0b3AgICAgPSAnJzsKICAgICAgICBteSAkU3RhcnQyICA9ICcnOwogICAgICAgIG15ICRTdG9wMiAgID0gJyc7CgogICAgICAgICRDb3VudGVyVHJlZSsrOwogICAgICAgIG15ICRUbXBTdWJqZWN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkTGFzdFNlbmRlclR5cGUgbmUgJEFydGljbGV7U2VuZGVyVHlwZX0gKSB7CiAgICAgICAgICAgICRDb3VudGVyIC49ICImbmJzcDsiOwogICAgICAgICAgICAkU3BhY2UgPSAiJENvdW50ZXImbmJzcDt8LS0mZ3Q7IjsKICAgICAgICB9CiAgICAgICAgJExhc3RTZW5kZXJUeXBlID0gJEFydGljbGV7U2VuZGVyVHlwZX07CgogICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gYWRkIDxiPgogICAgICAgIGlmICggJEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkU3RhcnQgID0gJzxpPjx1Pic7CiAgICAgICAgICAgICRTdGFydDIgPSAnPGI+JzsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gYWRkIDwvYj4KICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJFN0b3AgID0gJzwvdT48L2k+JzsKICAgICAgICAgICAgJFN0b3AyID0gJzwvYj4nOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRUbXBTdWJqZWN0LAogICAgICAgICAgICAgICAgU3BhY2UgICA9PiAkU3BhY2UsCiAgICAgICAgICAgICAgICBTdGFydCAgID0+ICRTdGFydCwKICAgICAgICAgICAgICAgIFN0b3AgICAgPT4gJFN0b3AsCiAgICAgICAgICAgICAgICBTdGFydDIgID0+ICRTdGFydDIsCiAgICAgICAgICAgICAgICBTdG9wMiAgID0+ICRTdG9wMiwKICAgICAgICAgICAgICAgIENvdW50ICAgPT4gJENvdW50ZXJUcmVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGF0dGFjaG1lbnQgaWNvbgogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGV7QXRtc30KICAgICAgICAgICAgJiYgJXsgJEFydGljbGV7QXRtc30gfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXknKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVGl0bGUgPSAnJzsKCiAgICAgICAgICAgICMgZG93bmxvYWQgdHlwZQogICAgICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICAgICAgICAgIyBpZiBhdHRhY2htZW50IHdpbGwgYmUgZm9yY2VkIHRvIGRvd25sb2FkLCBkb24ndCBvcGVuIGEgbmV3IGRvd25sb2FkIHdpbmRvdyEKICAgICAgICAgICAgbXkgJFRhcmdldCA9ICcnOwogICAgICAgICAgICBpZiAoICRUeXBlID1+IC9pbmxpbmUvaSApIHsKICAgICAgICAgICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKAogICAgICAgICAgICAgICAgMSAuLiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50JykgKyAxICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ291bnQgPiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXlDb3VudCcpICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUF0dGFjaG1lbnRNb3JlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JENvdW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0+ICRUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0F0bXN9LT57JENvdW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJEFydGljbGVPQiA9ICRBcnRpY2xlQm94WyRMYXN0Q3VzdG9tZXJBcnRpY2xlXTsKICAgIG15ICVBcnRpY2xlICAgPSAlJEFydGljbGVPQjsKCiAgICBteSAkQXJ0aWNsZUFycmF5ID0gMDsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZVRtcDEgPSAlJEFydGljbGVUbXA7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wMXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAlQXJ0aWNsZSA9ICVBcnRpY2xlVG1wMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgfQoKICAgICMgYWRkIGJsb2NrIGZvciBhdHRhY2htZW50cwogICAgaWYgKCVBdG1JbmRleCkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7IEtleSA9PiAnQXR0YWNobWVudCcsIH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJUZpbGUsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvd25sb2FkIHR5cGUKICAgICAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKCiAgICAgICAgICAgICMgaWYgYXR0YWNobWVudCB3aWxsIGJlIGZvcmNlZCB0byBkb3dubG9hZCwgZG9uJ3Qgb3BlbiBhIG5ldyBkb3dubG9hZCB3aW5kb3chCiAgICAgICAgICAgIG15ICRUYXJnZXQgPSAnJzsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvaW5saW5lL2kgKSB7CiAgICAgICAgICAgICAgICAkVGFyZ2V0ID0gJ3RhcmdldD0iYXR0YWNobWVudCIgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVGaWxlLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIlwkRW52e1wiQ0dJSGFuZGxlXCJ9L1wkUURhdGF7XCJGaWxlbmFtZVwifT9BY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50JkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9JkZpbGVJRD0kRmlsZUlEIiwKICAgICAgICAgICAgICAgICAgICBJbWFnZSAgPT4gJ2Rpc2stcy5wbmcnLAogICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqdXN0IGJvZHkgaWYgaHRtbCBlbWFpbAogICAgaWYgKCAkUGFyYW17IlNob3dIVE1MZU1haWwifSApIHsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykKICAgICAgICAgICAgICAgIC4gIi0kQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LSRBcnRpY2xle1RpY2tldElEfS0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICIkQXJ0aWNsZXtNaW1lVHlwZX07IGNoYXJzZXQ9JEFydGljbGV7Q2hhcnNldH0iLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgaWYgKCBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKCAlUGFyYW0sICVBcnRpY2xlICkgKSB7CiAgICAgICAgJFBhcmFteydBcnRpY2xlOjpUZXh0Tm90ZSd9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAkUGFyYW17J0FydGljbGU6OlRleHQnfSAgICAgPSAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICRQYXJhbXsnQXJ0aWNsZTo6VGV4dCd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgaWYgKCBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCggJVBhcmFtLCAlQXJ0aWNsZSApICkgewogICAgICAgICAgICAkUGFyYW17J0FydGljbGU6OlRleHROb3RlJ30gPSAkQ2hhcnNldFRleHQ7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBwbGFpbiBvciBodG1sIGJvZHkKICAgIG15ICRWaWV3VHlwZSA9ICdQbGFpbic7CgogICAgIyBpbiBjYXNlIHNob3cgcGxhaW4gYXJ0aWNsZSBib2R5IChpZiBubyBodG1sIGJvZHkgYXMgYXR0YWNobWVudCBleGlzdHMgb2YgaWYgcmljaAogICAgIyB0ZXh0IGlzIG5vdCBlbmFibGVkKQogICAgbXkgJFJpY2hUZXh0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwogICAgaWYgKCAkUmljaFRleHQgJiYgJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgJFZpZXdUeXBlID0gJ0hUTUwnOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCb2R5JyAuICRWaWV3VHlwZSwKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBhcnRpY2xlIGlkCiAgICAkUGFyYW17J0FydGljbGU6OkFydGljbGVJRCd9ID0gJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9sbG93IHVwIHBlcm1pc3Npb25zCiAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRGb2xsb3dVcE9wdGlvbiggUXVldWVJRCA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwgKTsKICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkQXJ0aWNsZXtTdGF0ZUlEfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5DdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICd1cGRhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICYmICgKICAgICAgICAgICAgKCAkRm9sbG93VXBQb3NzaWJsZSAhfiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkKICAgICAgICAgICAgfHwgJFN0YXRle1R5cGVOYW1lfSAhfiAvXmNsb3NlL2kKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVTdGF0ZVNlbGVjdGVkID0gKCk7CiAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRlU2VsZWN0ZWR7U2VsZWN0ZWRJRH0gPSAkUGFyYW17U3RhdGVJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3RhdGVTZWxlY3RlZHtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJU5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICVTdGF0ZVNlbGVjdGVkLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIG15ICVQcmlvcml0aWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVQcmlvcml0eVNlbGVjdGVkID0gKCk7CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRJRH0gPSAkUGFyYW17UHJpb3JpdHlJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9IHx8ICczIG5vcm1hbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICVQcmlvcml0eVNlbGVjdGVkLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkQ291bnQgZXEgMTMgfHwgJENvdW50IGVxIDE0KSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZWxlY3QgdGhlIG91dHB1dCB0ZW1wbGF0ZQogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRab29tJywKICAgICAgICBEYXRhID0+IHsgJUFydGljbGUsICVQYXJhbSwgfSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBmcmVlIHRleHQgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZC5kdGwsdiAxLjUgMjAxMC8wMS8yMCAxMzo1Mzo1MCB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjMwLjIuNCAyMDA5LzEyLzA4IDA5OjE1OjA4IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KJEluY2x1ZGV7IkFKQVgifQojIC0tLQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVHlwZUlEICYmIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRpY2tldCBUeXBlIGlzIHJlcXVpcmVkISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KICAgIC8vIGlmIFJpY2hUZXh0IGlzIGVuYWJsZWQsIHVwZGF0ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5vdyBmb3IgdGhlIGJvZHkgY29udGVudCBjaGVjayB0byB3b3JrIGNvcnJlY3RseQogICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkKCk7CiAgICB9CgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIGJvZHkhIn0nKTsKICAgICAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBSaWNoVGV4dEZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLkJvZHkuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLmxlbmd0aCkgewogICAgICAgIC8vIG5ldyBvd25lcgogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgwKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuTmV3T3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBwcmV2aW91cyBvd25lcgogICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDEpLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5PbGRPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNoYW5nZSBmcmVlIHRleHQgb2YgdGlja2V0In06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KIyAtLS0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VydmljZVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTglIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5ldyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMiUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9Lz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJPbGQiICREYXRheyJOZXdPd25lclR5cGU6Ok9sZCJ9Lz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPbGRPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzcG9uc2libGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlJlc3BvbnNpYmxlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBpbnZvbHZlZCBBZ2VudHMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ikludm9sdmVkQWdlbnRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlN1YmplY3QgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ieXVpLXNraW4tc2FtIj4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5vdGUgdHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZVR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW1wYWN0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyLz4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0Q2xvc2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBjbG9zZSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldENsb3NlLmR0bCx2IDEuNSAyMDEwLzAxLzIwIDEzOjUzOjUwIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldENsb3NlLmR0bCx2IDEuMjguMi40IDIwMDkvMTIvMDggMDk6MTU6MDggbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTQojIC0tLQokSW5jbHVkZXsiQUpBWCJ9CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgogICAgLy8gaWYgUmljaFRleHQgaXMgZW5hYmxlZCwgdXBkYXRlIHRoZSBoaWRkZW4gdGV4dGFyZWEgbm93IGZvciB0aGUgYm9keSBjb250ZW50IGNoZWNrIHRvIHdvcmsgY29ycmVjdGx5CiAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQoKTsKICAgIH0KCiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFJpY2hUZXh0Rm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICcgKyBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifS52YWx1ZSArICchJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0gJiYgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmNoZWNrZWQgPT0gZmFsc2UpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0hJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlICE9ICIiKSB7CiAgICAgICAgdmFyIHJlZyA9IC9eLXswLDF9XGQrPygoXC58LCl7MCwxfVxkKz8pezAsMX0kLzsKICAgICAgICBpZiAocmVnLnRlc3QoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUpID09IGZhbHNlKSB7CiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIHRpbWUhIn0nKTsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlID09ICIiICYmICRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lIn0pIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiWW91IG5lZWQgdG8gYWNjb3VudCB0aW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgoKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykubGVuZ3RoKSB7CiAgICAgICAgLy8gbmV3IG93bmVyCiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDApLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5OZXdPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIHByZXZpb3VzIG93bmVyCiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMSkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk9sZE93bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIFNwZWxsQ2hlY2tTdWJtaXQoKSB7CiAgICBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdzcGVsbGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5zcGVsbGluZy5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gY2hhbmdlX3NlbGVjdGVkKHNlbCkgewogICAgc3RhcnRfZWxlbWVudHMgPSAoc2VsICsgNCk7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1swXS5uYW1lID09ICIkQ29uZmlneyJTZXNzaW9uTmFtZSJ9IikgewogICAgICAgIHN0YXJ0X2VsZW1lbnRzID0gc3RhcnRfZWxlbWVudHMgKyAxOwogICAgfQogICAgaWYgKCFkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkKSB7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCA9IHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+CjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNsb3NlIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUaXRsZSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNMQVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBBZ2VudCJ9OiAoJFRleHR7Ik9wdGlvbmFsIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5dWktc2tpbi1zYW0iPgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KJEluY2x1ZGV7IlJpY2hUZXh0RWRpdG9yIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgbmFtZT0iQm9keSIgcm93cz0iMTYiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnIvPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0RGVjaXNpb24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWNpc2lvbiBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldERlY2lzaW9uLmR0bCx2IDEuNCAyMDEwLzAxLzIwIDEzOjU0OjI2IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUuZHRsLHYgMS4zNC4yLjQgMjAwOS8xMi8wOCAwOToxNTowOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgUmljaFRleHRGb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CgogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5sZW5ndGgpIHsKICAgICAgICAvLyBuZXcgb3duZXIKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMCkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk5ld093bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gcHJldmlvdXMgb3duZXIKICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgxKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuT2xkT3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJBZGQgbm90ZSB0byB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJBZGQgZGVjaXNpb24gdG8gdGlja2V0In06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQojIC0tLQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4KICAgICAgICAgICAgKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgdmFsdWU9IiIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUaXRsZSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNMQVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBBZ2VudCJ9OiAoJFRleHR7Ik9wdGlvbmFsIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5dWktc2tpbi1zYW0iPgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KJEluY2x1ZGV7IlJpY2hUZXh0RWRpdG9yIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgbmFtZT0iQm9keSIgcm93cz0iMTYiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnIvPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0RW1haWwuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBhZ2VudCBlbWFpbAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRFbWFpbC5kdGwsdiAxLjEwIDIwMTAvMDEvMjAgMTM6NTQ6MjYgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0RW1haWwuZHRsLHYgMS41MC4yLjUgMjAwOS8xMC8zMCAwOTozOToxMSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyBpbmNsdWRlIEFKQVggbGliCiRJbmNsdWRleyJBSkFYIn0KCiRJbmNsdWRleyJBZ2VudEN1c3RvbWVyU2VhcmNoIn0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci5teUF1dG9Db21wbGV0ZSB7CndpZHRoOjMyZW07IC8qIHNldCB3aWR0aCBoZXJlIG9yIGVsc2Ugd2lkZ2V0IHdpbGwgZXhwYW5kIHRvIGZpdCBpdHMgY29udGFpbmVyICovCnBhZGRpbmctYm90dG9tOjAuNWVtOwp9Cjwvc3R5bGU+Cgo8IS0tIHN0YXJ0IGZvcm0gLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFJpY2hUZXh0Rm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChpc05hTihkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5Nb250aC52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlKSB8fCBpc05hTihkb2N1bWVudC5jb21wb3NlLkhvdXIudmFsdWUpIHx8IGlzTmFOKGRvY3VtZW50LmNvbXBvc2UuTWludXRlLnZhbHVlKSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIGRhdGUhIn0nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSA8IDEgfHwgZG9jdW1lbnQuY29tcG9zZS5EYXkudmFsdWUgPiAzMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlIDwgMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlID4gMTIgfHwgZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlIDwgOTk5IHx8IGRvY3VtZW50LmNvbXBvc2UuWWVhci52YWx1ZSA+IDEwMDAwIHx8IGRvY3VtZW50LmNvbXBvc2UuSG91ci52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5Ib3VyLnZhbHVlID4gMjMgfHxkb2N1bWVudC5jb21wb3NlLk1pbnV0ZS52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5NaW51dGUudmFsdWUgPiA1OSAgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgZGF0ZSEifScpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEJvb2tDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LmJvb2suVG8udmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLlRvLnZhbHVlOwogICAgZG9jdW1lbnQuYm9vay5DYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQ2MudmFsdWU7CiAgICBkb2N1bWVudC5ib29rLkJjYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQmNjLnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdib29rJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmJvb2suc3VibWl0KCkKICAgIGRvY3VtZW50LmJvb2sud2FzX3NwZWxsX2NoZWNrZWQ9dHJ1ZTsKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEN1c3RvbWVyU3VibWl0KCkgewogICAgd2luZG93Lm9wZW4oJycsICdjdXN0b21lcicsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5jdXN0b21lci5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gY2xlYXJfZmllbGQoKSB7CiAgICBkb2N1bWVudC5jb21wb3NlLlRvLnZhbHVlID0gIiI7CiAgICBkb2N1bWVudC5jb21wb3NlLlRvLmZvY3VzKCk7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249ImxlZnQiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDb21wb3NlIEVtYWlsIn0gLyAkVGV4dHsibmV3IHRpY2tldCJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRMaW5rT2JqZWN0Jk1vZGU9VGVtcG9yYXJ5JlNvdXJjZU9iamVjdD1UaWNrZXQmU291cmNlS2V5PSRRRGF0YXsiRm9ybUlEIn0mVGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgb25DbGljaz0ibGlua3dpbj13aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9OTAwLGhlaWdodD03MDAsbGVmdD01MCx0b3A9NTAnKTsgbGlua3dpbi5mb2N1cygpOyIgdGFyZ2V0PSJzZXR0aW5nIj4kVGV4dHsiTGluayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgojIC0tLQogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIwIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iT3duZXJBbGwiIHZhbHVlPSIkUURhdGF7Ik93bmVyQWxsIn0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXNwb25zaWJsZUFsbCIgdmFsdWU9IiRRRGF0YXsiUmVzcG9uc2libGVBbGwifSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIHZhbHVlPSIkUURhdGF7IkN1c3RvbWVyVXNlciJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZyb20ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI2MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGcm9tU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRlc3RpbmF0aW9uIGludmFsaWQifSJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpGcm9tVXBkYXRlU3VibWl0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiUmVmcmVzaCJ9IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUyIi8+CjwhLS0gZHRsOmJsb2NrOkZyb21VcGRhdGVTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHJvd3NwYW49IjEwIiBjbGFzcz0iY29udGVudHZhbHVlIj4KIyBzaG93IGN1c3RvbWVyIGluZm8gdGFibGUKPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPiRUZXh0eyJDdXN0b21lciBJbmZvIn08L2I+Ojxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lclRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG8ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlIiBjbGFzcz0ibXlBdXRvQ29tcGxldGUiPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im15QXV0b0NvbXBsZXRlSW5wdXQiIHR5cGU9InRleHQiIG5hbWU9IlRvIiB2YWx1ZT0iJFFEYXRheyJUbyJ9IiBzaXplPSI3MCIvPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGVDb250YWluZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCAtLT4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVUb0ludmFsaWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVUb0ludmFsaWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVG8gaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IkN1c3RvbWVyVXNlclN0cmcifSBuZSAiIikgeyAkRGF0YXsiVGFrZVRoaXNDdXN0b21lciJ9ID0gIjxici8+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lMiIgdmFsdWU9IiRUZXh0eyJUYWtlIHRoaXMgQ3VzdG9tZXIifSIvPiI7IH0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRha2VUaGlzQ3VzdG9tZXIifQo8IS0tIGR0bDpibG9jazpTZWFyY2hDdXN0b21lckJ1dHRvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUxIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCBDdXN0b21lciJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQ2xlYXJUbyIgdmFsdWU9IiRUZXh0eyJDbGVhciBUbyJ9IiBvbmNsaWNrPSJqYXZhc2NyaXB0OmNsZWFyX2ZpZWxkKCk7IHJldHVybiBmYWxzZTsiLz4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoQ3VzdG9tZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNjIiB2YWx1ZT0iJFFEYXRheyJDYyJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkNjIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQmNjIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQmNjIiB2YWx1ZT0iJFFEYXRheyJCY2MifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCY2MgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiU2VydmljZVN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlNMQVN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNMQSAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOk93bmVyU2VsZWN0aW9uQWxsSlMgLS0+CiMgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLk93bmVyQWxsLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBbGwgQWdlbnRzIn0nOyByZXR1cm4gdHJ1ZTsiPiRUZXh0eyJBbGwifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuT3duZXJBbGwudmFsdWU9JzEnOyBBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydPd25lckFsbCcsICdEZXN0J10sIFsnTmV3VXNlcklEJ10pOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFsbCJ9IiBuYW1lPSJPd25lckFsbFJlZnJlc2giLz4KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUyAtLT4KIyAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUmVzcG9uc2libGVBbGwudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iZG9jdW1lbnQuY29tcG9zZS5SZXNwb25zaWJsZUFsbC52YWx1ZT0nMSc7IEFKQVhVcGRhdGUoJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ1Jlc3BvbnNpYmxlQWxsJywgJ0Rlc3QnXSwgWydOZXdSZXNwb25zaWJsZUlEJ10pOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbkFsbEpTIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFsbCJ9IiBuYW1lPSJSZXNwb25zaWJsZUFsbFJlZnJlc2giLz4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsdWUifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JERhdGF7IkludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CjwhLS0gZHRsOmJsb2NrOkFkZHJlc3NCb29rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iQm9va0NoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBZGRyZXNzIEJvb2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWNvbnRlbnRzLnBuZyI+JFRleHR7IkFkZHJlc3MgQm9vayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpBZGRyZXNzQm9vayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IkN1c3RvbWVyU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJDdXN0b21lciJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9Z3JvdXAtc21hbGwucG5nIj4kVGV4dHsiQ3VzdG9tZXIifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inl1aS1za2luLXNhbSI+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3IifQojIHNldCB3aGl0ZSBiYWNrZ3JvdW5kIGZvciBidXR0b25zCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CjwhLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnl1aS1za2luLXNhbSAueXVpLXRvb2xiYXItY29udGFpbmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYUVtYWlsIn0iIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNpZ25hdHVyZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IlNpZ25hdHVyZSIgcm93cz0iNSIgY29scz0iODIiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iIHJlYWRvbmx5PiREYXRheyJTaWduYXR1cmUifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgdmFsdWU9IiRRRGF0YXsiQ3VzdG9tZXJJRCJ9IiBzaXplPSIyNSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCB0aWNrZXQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiTmV4dFN0YXRlc1N0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgRGF0ZSJ9ICgkVGV4dHsiZm9yIHBlbmRpbmcqIHN0YXRlcyJ9KTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQZW5kaW5nRGF0ZVN0cmluZyJ9PGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZW5kIG1haWwhIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImJvb2siIHRhcmdldD0iYm9vayI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRCb29rIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVG8iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJjYyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjdXN0b21lciIgdGFyZ2V0PSJjdXN0b21lciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWRtaW5DdXN0b21lclVzZXIiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJOYXYiIHZhbHVlPSJOb25lIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldoYXQiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo8ZGl2IGlkPSJDdXN0b21lclRpY2tldHMiPjwvZGl2Pgo=
IyAtLQojIEFnZW50VGlja2V0RnJlZVRleHQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBmcmVlIHRleHQgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjQgMjAxMC8wMS8yMCAxMzo1NDoyNiB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjMwLjIuNCAyMDA5LzEyLzA4IDA5OjE1OjA4IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KJEluY2x1ZGV7IkFKQVgifQojIC0tLQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVHlwZUlEICYmIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRpY2tldCBUeXBlIGlzIHJlcXVpcmVkISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KICAgIC8vIGlmIFJpY2hUZXh0IGlzIGVuYWJsZWQsIHVwZGF0ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5vdyBmb3IgdGhlIGJvZHkgY29udGVudCBjaGVjayB0byB3b3JrIGNvcnJlY3RseQogICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkKCk7CiAgICB9CgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIGJvZHkhIn0nKTsKICAgICAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBSaWNoVGV4dEZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLkJvZHkuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLmxlbmd0aCkgewogICAgICAgIC8vIG5ldyBvd25lcgogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgwKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuTmV3T3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBwcmV2aW91cyBvd25lcgogICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDEpLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5PbGRPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDaGFuZ2UgZnJlZSB0ZXh0IG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VydmljZVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTglIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5ldyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMiUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9Lz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJPbGQiICREYXRheyJOZXdPd25lclR5cGU6Ok9sZCJ9Lz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPbGRPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzcG9uc2libGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlJlc3BvbnNpYmxlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBpbnZvbHZlZCBBZ2VudHMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ikludm9sdmVkQWdlbnRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlN1YmplY3QgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ieXVpLXNraW4tc2FtIj4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5vdGUgdHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZVR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW1wYWN0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyLz4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0Tm90ZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIG5vdGUgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXROb3RlLmR0bCx2IDEuNCAyMDEwLzAxLzIwIDEzOjU0OjI2IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUuZHRsLHYgMS4zNC4yLjQgMjAwOS8xMi8wOCAwOToxNTowOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgUmljaFRleHRGb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CgogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5sZW5ndGgpIHsKICAgICAgICAvLyBuZXcgb3duZXIKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMCkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk5ld093bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gcHJldmlvdXMgb3duZXIKICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgxKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuT2xkT3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQWRkIG5vdGUgdG8gdGlja2V0In06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4KICAgICAgICAgICAgKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgdmFsdWU9IiIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUaXRsZSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNMQVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBBZ2VudCJ9OiAoJFRleHR7Ik9wdGlvbmFsIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5dWktc2tpbi1zYW0iPgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KJEluY2x1ZGV7IlJpY2hUZXh0RWRpdG9yIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgbmFtZT0iQm9keSIgcm93cz0iMTYiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnIvPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBUaWNrZXQgT3ZlcnZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0uZHRsLHYgMS4zIDIwMTAvMDIvMTEgMjI6MTg6MTggdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0uZHRsLHYgMS41LjIuMiAyMDEwLzAyLzAxIDAxOjAwOjA1IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxJSIgY2xhc3M9Im1haW5oZWFkIj4KPCEtLSBkdGw6YmxvY2s6QnVsayAtLT4KICAgICAgICAgICAgPGZvcm0gbmFtZT0iYnVsayI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9IiBvbmNsaWNrPSJzZWxlY3RfaXRlbSgkUURhdGF7IkNvdW50ZXIifSwkUURhdGF7IlRpY2tldElEIn0pIiBhdXRvY29tcGxldGU9Im9mZiIvPgogICAgICAgICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI2MCUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRDb25maWd7IlRpY2tldDo6SG9vayJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgICAgICAgJFFEYXRheyJUaXRsZSIsIjYwIn0KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIzOSUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJBZ2UifTogJERhdGF7IkFnZSJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjYwJSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAgICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIiBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiAkVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgd2lkdGg9IjYwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjgwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCI4MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIyAtLQojIHNob3cgRnJlZUtleTEtMyBhbmQgRnJlZVRleHQxLTMgKGluIG90aGVyIHdheSBsaWtlIHRoZSBibG9jaywgc28geW91IGNvdWxkIGFkZCBsaW5rIG9yIHNvbWV0aGluIGVsc2UpCiMgLS0KIzxkdGwgaWYgKCREYXRheyJGcmVlS2V5MSJ9IG5lICIiKSB7ICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzEifSA9ICI8dHI+PHRkIHZhbGlnbj0idG9wIj48Yj4kUURhdGF7IkZyZWVLZXkxIn06PC9iPjwvdGQ+PHRkPiAkUURhdGF7IkZyZWVUZXh0MSJ9PC90ZD48L3RyPiI7IH0+CiM8ZHRsIGlmICgkRGF0YXsiRnJlZUtleTIifSBuZSAiIikgeyAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcyIn0gPSAiPHRyPjx0ZCB2YWxpZ249InRvcCI+PGI+JFFEYXRheyJGcmVlS2V5MiJ9OjwvYj48L3RkPjx0ZD4gJFFEYXRheyJGcmVlVGV4dDIifTwvdGQ+PC90cj4iOyB9PgojPGR0bCBpZiAoJERhdGF7IkZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgdmFsaWduPSJ0b3AiPjxiPiRRRGF0YXsiRnJlZUtleTMifTo8L2I+PC90ZD48dGQ+ICRRRGF0YXsiRnJlZVRleHQzIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0KIyAtLQogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgY2xhc3M9IlByaW9yaXR5SUQtJERhdGF7IlByaW9yaXR5SUQifSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlR5cGUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjE4In08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTdGF0ZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJRdWV1ZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUURhdGF7IlF1ZXVlIn0iPiRRRGF0YXsiUXVldWUiLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgY2xhc3M9IlByaW9yaXR5SUQtJERhdGF7IlByaW9yaXR5SUQifSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmsifSIgJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmtUYXJnZXQifT4kUXVvdGV7IiREYXRheyJDdXN0b21lcklEIn0iLCIxNCJ9PC9hPjxiciAvPjxkaXYgdGl0bGU9IiRRRGF0YXsiQ3VzdG9tZXJOYW1lIn0iPiRRRGF0YXsiQ3VzdG9tZXJOYW1lIiwiMTUifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTZXJ2aWNlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiU2VydmljZSJ9Ij4kUURhdGF7IlNlcnZpY2UiLCIxOCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTTEEifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJTTEEifSI+JFFEYXRheyJTTEEiLCIxOCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUHJpb3JpdHkifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9IiwiMTQifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJDdXN0b21lcklEIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iICRDb25maWd7IkN1c3RvbWVyREJMaW5rVGFyZ2V0In0+JFF1b3RleyIkRGF0YXsiQ3VzdG9tZXJJRCJ9IiwiMTQifTwvYT48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUh1bWFuIn0gLyAkVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlVwZGF0ZSBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9Ij4kUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiMgLS0KIyBzaG93IFRpY2tldEZyZWVLZXkxLTIgYW5kIFRpY2tldEZyZWVUZXh0MS0yCjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5IiwiMjUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPjxhIGhyZWY9IiREYXRheyJUaWNrZXRGcmVlVGV4dExpbmsifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9hPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjI1In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazEifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgICA8L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjUifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MiJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIwojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZVRpbWUxLTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiMgdXNlIHRoZSBmb2xsb3dpbmcgaWYgeW91IHdhbnQgYWxzbyBhIGNoYW5nZSBxdWV1ZSBvcHRpb24gaW4gdGhpcyB2aWV3CiMgIDx0cj4KIyAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgojICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9IlByaW9yaXR5SUQtJERhdGF7IlByaW9yaXR5SUQifSI+PGI+JFRleHR7IkNoYW5nZSBxdWV1ZSJ9OjwvYj48L3RkPgojICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9IlByaW9yaXR5SUQtJERhdGF7IlByaW9yaXR5SUQifSI+CiMgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiMgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0TW92ZSIvPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iJFFEYXRheyJRdWV1ZUlEIn0iLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KIyAgICAgICAgJERhdGF7Ik1vdmVRdWV1ZXNTdHJnIn0KIyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJNb3ZlIn0iLz4KIyAgICAgIDwvZm9ybT4KIyAgICA8L3RkPgojICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgVGlja2V0IE92ZXJ2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldy5kdGwsdiAxLjIgMjAwOS8wOS8zMCAxNzo1MzozOSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcuZHRsLHYgMS41LjIuMSAyMDA5LzA5LzIzIDA5OjIwOjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgdGlja2V0IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxJSIgY2xhc3M9Im1haW5oZWFkIj4KPCEtLSBkdGw6YmxvY2s6QnVsayAtLT4KICAgICAgICAgICAgPGZvcm0gbmFtZT0iYnVsayI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9IiBvbmNsaWNrPSJzZWxlY3RfaXRlbSgkUURhdGF7IkNvdW50ZXIifSwkUURhdGF7IlRpY2tldElEIn0pIiBhdXRvY29tcGxldGU9Im9mZiIvPgogICAgICAgICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjYwJSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgICAgICAgICAkUURhdGF7IlRpdGxlIiwiNjAifQogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjM5JSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFnZSJ9OiAkRGF0YXsiQWdlIn0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNjAlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgICAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSI0MCUiIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyBGcm9tOiwgVG86LCBDYzoKPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE1JSI+PGI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiODAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiMgc2hvdyB0aGUgQXJ0aWNsZTo6RnJlZUtleTEtMyBhbmQgQXJ0aWNsZTo6RnJlZVRleHQxLTMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE1JSI+PGI+JFFEYXRheyJLZXkifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjgwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojIC0tCiMgc2hvdyBGcmVlS2V5MS0zIGFuZCBGcmVlVGV4dDEtMyAoaW4gb3RoZXIgd2F5IGxpa2UgdGhlIGJsb2NrLCBzbyB5b3UgY291bGQgYWRkIGxpbmsgb3Igc29tZXRoaW4gZWxzZSkKIyAtLQojPGR0bCBpZiAoJERhdGF7IkZyZWVLZXkxIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9ID0gIjx0cj48dGQgdmFsaWduPSJ0b3AiPjxiPiRRRGF0YXsiRnJlZUtleTEifTo8L2I+PC90ZD48dGQ+ICRRRGF0YXsiRnJlZVRleHQxIn08L3RkPjwvdHI+IjsgfT4KIzxkdGwgaWYgKCREYXRheyJGcmVlS2V5MiJ9IG5lICIiKSB7ICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifSA9ICI8dHI+PHRkIHZhbGlnbj0idG9wIj48Yj4kUURhdGF7IkZyZWVLZXkyIn06PC9iPjwvdGQ+PHRkPiAkUURhdGF7IkZyZWVUZXh0MiJ9PC90ZD48L3RyPiI7IH0+CiM8ZHRsIGlmICgkRGF0YXsiRnJlZUtleTMifSBuZSAiIikgeyAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0gPSAiPHRyPjx0ZCB2YWxpZ249InRvcCI+PGI+JFFEYXRheyJGcmVlS2V5MyJ9OjwvYj48L3RkPjx0ZD4gJFFEYXRheyJGcmVlVGV4dDMifTwvdGQ+PC90cj4iOyB9PgojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcxIn0KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMiJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzMifQojIHNob3cgYXJ0aWNsZSBvcHRpb25zIGxpa2Ugc2lnbmVkLCBjcnlwdGVkLCAuLi4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZU9wdGlvbi0tPgogICAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IlN1Y2Nlc3NmdWwifSBlcSAiMCIpIHsgJERhdGF7IlN0YXJ0Rm9udCJ9ID0gIjxmb250IGNvbG9yPSJyZWQiPiI7IH0+CiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIwIikgeyAkRGF0YXsiU3RvcEZvbnQifSA9ICI8L2ZvbnQ+IjsgfT4KICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjEiKSB7ICREYXRheyJTdGFydEZvbnQifSA9ICI8Zm9udCBjb2xvcj0iZ3JlZW4iPiI7IH0+CiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIxIikgeyAkRGF0YXsiU3RvcEZvbnQifSA9ICI8L2ZvbnQ+IjsgfT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiPjxiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JERhdGF7IlN0YXJ0Rm9udCJ9JFFEYXRheyJWYWx1ZSIsIjgwIn0kRGF0YXsiU3RvcEZvbnQifTwvZGl2PjwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlT3B0aW9uIC0tPgogICAgICAgICAgICA8L3RhYmxlPgokRGF0YXsiQm9keU5vdGUifQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KJERhdGF7IkJvZHkifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCB3aWR0aD0iMjUlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJUeXBlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7IlR5cGUifSI+JFFEYXRheyJUeXBlIiwiMTgifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlN0YXRlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9IiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgojICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUXVldWUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU2VydmljZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJTZXJ2aWNlIn0iPiRRRGF0YXsiU2VydmljZSIsIjE4In08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNMQSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJTTEEifSI+JFFEYXRheyJTTEEiLCIxOCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUh1bWFuIn08YnIvPiRUaW1lU2hvcnR7IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJVcGRhdGVUaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifTxici8+JFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJTb2x1dGlvblRpbWVXb3JraW5nVGltZSJ9Ij4kUURhdGF7IlNvbHV0aW9uVGltZUh1bWFuIn08YnIvPiRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJJbXBhY3QifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJDdXN0b21lcklEIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIkQ29uZmlneyJDdXN0b21lckRCTGluayJ9IiAkQ29uZmlneyJDdXN0b21lckRCTGlua1RhcmdldCJ9PiRRdW90ZXsiJERhdGF7IkN1c3RvbWVySUQifSIsIjE4In08L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgojICAgICAgICAgIDx0ciAgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJPd25lciJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiT3duZXIifSI+JFFEYXRheyJPd25lciIsIjE4In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiMgLS0KCiMgc2hvdyBUaWNrZXRGcmVlS2V5MS0yIGFuZCBUaWNrZXRGcmVlVGV4dDEtMgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5IiwiMjUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPjxhIGhyZWY9IiREYXRheyJUaWNrZXRGcmVlVGV4dExpbmsifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9hPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkxIiwiMjUifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4xIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MSJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4xIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMSAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMSJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMSAtLT4KIyAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRRRGF0YXsiVGlja2V0RnJlZUtleTIiLCIyNSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIn0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIiwiMjUifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsyIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MiJ9Ij48YSBocmVmPSIkQ29uZmlneyJUaWNrZXRGcmVlVGV4dExpbmsyIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjI1In08L2E+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsyIC0tPgojICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KCiAgICAgICAgICAgICAgICA8L3RhYmxlPgojIHNob3cgY3VzdG9tZXIgaW5mbyB0YWJsZQo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgogICAgICAgICAgICAgICAgPHA+PGhyPjxiPiRUZXh0eyJDdXN0b21lciBJbmZvIn06PC9iPiAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9PGhyPjwvcD4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSI5NSUiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojIHNob3cgY29tcG9zZSBsaW5rcwo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlciAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXJDb21wb3NlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+JFRleHR7IkNvbXBvc2UgQW5zd2VyIn0gKCRUZXh0eyJlbWFpbCJ9KTo8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiU3RkUmVzcG9uc2VzU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyQ29tcG9zZSAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXJQaG9uZU91dGJvdW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+JFRleHR7IkNvbnRhY3QgY3VzdG9tZXIifSAoJFRleHR7InBob25lIn0pOjwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJBZ2VudFBob25lIn0gbmUgIjAiKSB7ICREYXRheyJBZ2VudFBob25lU3RyZyJ9ID0gIjxsaT48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0UGhvbmVPdXRib3VuZCZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSZRdWV1ZUlEPSREYXRheyJRdWV1ZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJQaG9uZSBjYWxsIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiUGhvbmUgY2FsbCJ9PC9hPjwvbGk+IjsgfT4KJERhdGF7IkFnZW50UGhvbmVTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXJQaG9uZU91dGJvdW5kIC0tPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9Ijk1JSI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOk1vdmUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ2hhbmdlIHF1ZXVlIn06PC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iJFFEYXRheyJRdWV1ZUlEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJNb3ZlUXVldWVzU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJNb3ZlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TW92ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9wPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCB0aWNrZXQgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0T3duZXIuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBvd25lciBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE93bmVyLmR0bCx2IDEuNCAyMDEwLzAxLzIwIDEzOjU0OjI2IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE93bmVyLmR0bCx2IDEuMjYuMi40IDIwMDkvMTIvMDggMDk6MTU6MDggbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTQojIC0tLQokSW5jbHVkZXsiQUpBWCJ9CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgogICAgIC8vIGlmIFJpY2hUZXh0IGlzIGVuYWJsZWQsIHVwZGF0ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5vdyBmb3IgdGhlIGJvZHkgY29udGVudCBjaGVjayB0byB3b3JrIGNvcnJlY3RseQogICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkKCk7CiAgICB9CgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIGJvZHkhIn0nKTsKICAgICAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBSaWNoVGV4dEZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLkJvZHkuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLmxlbmd0aCkgewogICAgICAgIC8vIG5ldyBvd25lcgogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgwKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuTmV3T3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBwcmV2aW91cyBvd25lcgogICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDEpLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5PbGRPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDaGFuZ2Ugb3duZXIgb2YgdGlja2V0In06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgdmFsdWU9IiIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUaXRsZSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNMQVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBBZ2VudCJ9OiAoJFRleHR7Ik9wdGlvbmFsIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5dWktc2tpbi1zYW0iPgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KJEluY2x1ZGV7IlJpY2hUZXh0RWRpdG9yIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgbmFtZT0iQm9keSIgcm93cz0iMTYiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnIvPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0UGVuZGluZy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHBlbmRpbmcgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQZW5kaW5nLmR0bCx2IDEuNCAyMDEwLzAxLzIwIDEzOjU0OjI2IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFBlbmRpbmcuZHRsLHYgMS4zMi4yLjQgMjAwOS8xMi8wOCAwOToxNTowOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgUmljaFRleHRGb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CgogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5sZW5ndGgpIHsKICAgICAgICAvLyBuZXcgb3duZXIKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMCkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk5ld093bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gcHJldmlvdXMgb3duZXIKICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykuaXRlbSgxKS5jaGVja2VkCiAgICAgICAgICAgICYmIGRvY3VtZW50LmNvbXBvc2UuT2xkT3duZXJJRC52YWx1ZSA9PSAnJykgewoKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn0nKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2V0IFBlbmRpbmcifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn13YXJuaW5nLnBuZyIgYWx0PSIkVGV4dHsiSW5mbyJ9Ij46IDxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJUaWNrZXQgbG9ja2VkISJ9PC9mb250PiAoPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldExvY2smU3ViYWN0aW9uPVVubG9jayZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlRpY2tldCB1bmxvY2shIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiVGlja2V0IHVubG9jayEifTwvYT4pCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU2VydmljZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iTmV3IiAkRGF0YXsiTmV3T3duZXJUeXBlOjpOZXcifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXNwb25zaWJsZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inl1aS1za2luLXNhbSI+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3IifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTdGF0ZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0UGhvbmUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBwaG9uZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQaG9uZS5kdGwsdiAxLjEwIDIwMTAvMDEvMjAgMTM6NTQ6NTUgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGhvbmUuZHRsLHYgMS41MC4yLjUgMjAwOS8xMC8zMCAwOTozOToxMSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyBpbmNsdWRlIEFKQVggbGliCiRJbmNsdWRleyJBSkFYIn0KCiRJbmNsdWRleyJBZ2VudEN1c3RvbWVyU2VhcmNoIn0KCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQoKZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFJpY2hUZXh0Rm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChpc05hTihkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5Nb250aC52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlKSB8fCBpc05hTihkb2N1bWVudC5jb21wb3NlLkhvdXIudmFsdWUpIHx8IGlzTmFOKGRvY3VtZW50LmNvbXBvc2UuTWludXRlLnZhbHVlKSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIGRhdGUhIn0nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSA8IDEgfHwgZG9jdW1lbnQuY29tcG9zZS5EYXkudmFsdWUgPiAzMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlIDwgMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlID4gMTIgfHwgZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlIDwgOTk5IHx8IGRvY3VtZW50LmNvbXBvc2UuWWVhci52YWx1ZSA+IDEwMDAwIHx8IGRvY3VtZW50LmNvbXBvc2UuSG91ci52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5Ib3VyLnZhbHVlID4gMjMgfHxkb2N1bWVudC5jb21wb3NlLk1pbnV0ZS52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5NaW51dGUudmFsdWUgPiA1OSAgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgZGF0ZSEifScpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEN1c3RvbWVyU3VibWl0KCkgewogICAgd2luZG93Lm9wZW4oJycsICdjdXN0b21lcicsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5jdXN0b21lci5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gY2xlYXJfZmllbGQoKSB7CiAgICBkb2N1bWVudC5jb21wb3NlLkZyb20udmFsdWUgPSAiIjsKICAgIGRvY3VtZW50LmNvbXBvc2UuRnJvbS5mb2N1cygpOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJQaG9uZSBjYWxsIn0gLyAkVGV4dHsibmV3IHRpY2tldCJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRMaW5rT2JqZWN0Jk1vZGU9VGVtcG9yYXJ5JlNvdXJjZU9iamVjdD1UaWNrZXQmU291cmNlS2V5PSRRRGF0YXsiRm9ybUlEIn0mVGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgb25DbGljaz0ibGlua3dpbj13aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9OTAwLGhlaWdodD03MDAsbGVmdD01MCx0b3A9NTAnKTsgbGlua3dpbi5mb2N1cygpOyIgdGFyZ2V0PSJzZXR0aW5nIj4kVGV4dHsiTGluayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgojIC0tLQogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgojICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIyIi8+CiMgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJFeGFtcGxlIFN1YmplY3QiLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9Ik5hbWU6CiMgICAgICAgIFByb2R1Y3Q6CiMgICAgICAgIENvbW1lbnQ6Ii8+CiMgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IiIgdmFsdWU9IiRUZXh0eyJFeGFtcGxlIFRlbXBsYXRlIn0iLz4KIyAgICAgIDwvZm9ybT4KIyAgICAgIDxocj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMCIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik93bmVyQWxsIiB2YWx1ZT0iJFFEYXRheyJPd25lckFsbCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXNwb25zaWJsZUFsbCIgdmFsdWU9IiRRRGF0YXsiUmVzcG9uc2libGVBbGwifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iJFFEYXRheyJDdXN0b21lclVzZXIifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkxpbmtUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiTGlua1RpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRnJvbSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNjAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZTdGFydC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGUiIGNsYXNzPSJteUF1dG9Db21wbGV0ZSI+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJteUF1dG9Db21wbGV0ZUlucHV0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJGcm9tIiB2YWx1ZT0iJFFEYXRheyJGcm9tIn0iIHNpemU9IjgwIi8+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlQ29udGFpbmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCAtLT4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGVGcm9tSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRnJvbUludmFsaWQgLS0+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRnJvbSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9IG5lICIiKSB7ICREYXRheyJUYWtlVGhpc0N1c3RvbWVyIn0gPSAiPGJyLz48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUyIiB2YWx1ZT0iJFRleHR7IlRha2UgdGhpcyBDdXN0b21lciJ9Ii8+IjsgfT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUYWtlVGhpc0N1c3RvbWVyIn0KPCEtLSBkdGw6YmxvY2s6U2VhcmNoQ3VzdG9tZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUxIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCBDdXN0b21lciJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJDbGVhckZyb20iIHZhbHVlPSIkVGV4dHsiQ2xlYXIgRnJvbSJ9IiBvbmNsaWNrPSJqYXZhc2NyaXB0OmNsZWFyX2ZpZWxkKCk7IHJldHVybiBmYWxzZTsiLz4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoQ3VzdG9tZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiByb3dzcGFuPSIxMCIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9PC9iPjo8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lclRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUb1N0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEZXN0aW5hdGlvbiBpbnZhbGlkIn0ifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VG9VcGRhdGVTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlJlZnJlc2gifSIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lMiIvPgo8IS0tIGR0bDpibG9jazpUb1VwZGF0ZVN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTZXJ2aWNlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNMQSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTTEFTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyU2VsZWN0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgojICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Pd25lckFsbC52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQWxsIEFnZW50cyJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiQWxsIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuT3duZXJBbGwudmFsdWU9JzEnOyBBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydPd25lckFsbCcsICdEZXN0J10sIFsnTmV3VXNlcklEJ10pOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWxsIn0iIG5hbWU9Ik93bmVyQWxsUmVmcmVzaCIvPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUyAtLT4KIyAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUmVzcG9uc2libGVBbGwudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJkb2N1bWVudC5jb21wb3NlLlJlc3BvbnNpYmxlQWxsLnZhbHVlPScxJzsgQUpBWFVwZGF0ZSgnQUpBWFVwZGF0ZScsICdSZXNwb25zaWJsZUFsbCcsIFsnUmVzcG9uc2libGVBbGwnLCAnRGVzdCddLCBbJ05ld1Jlc3BvbnNpYmxlSUQnXSk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQWxsIEFnZW50cyJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiQWxsIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uQWxsSlMgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uQWxsU3VibWl0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBbGwifSIgbmFtZT0iUmVzcG9uc2libGVBbGxSZWZyZXNoIi8+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uQWxsU3VibWl0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjgwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iQ3VzdG9tZXJTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkN1c3RvbWVyIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1ncm91cC1zbWFsbC5wbmciPiRUZXh0eyJDdXN0b21lciJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ieXVpLXNraW4tc2FtIj4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CiMgc2V0IHdoaXRlIGJhY2tncm91bmQgZm9yIGJ1dHRvbnMKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KPCEtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC55dWktc2tpbi1zYW0gLnl1aS10b29sYmFyLWNvbnRhaW5lciB7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0eWxlPgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1c3RvbWVySUQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDdXN0b21lcklEIiB2YWx1ZT0iJFFEYXRheyJDdXN0b21lcklEIn0iIHNpemU9IjI1Ii8+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCB0aWNrZXQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJOZXh0U3RhdGVzU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBEYXRlIn0gKCRUZXh0eyJmb3IgcGVuZGluZyogc3RhdGVzIn0pOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGVuZGluZ0RhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkNyZWF0ZSIgdmFsdWU9IiRUZXh0eyJDcmVhdGUifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjdXN0b21lciIgdGFyZ2V0PSJjdXN0b21lciI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZG1pbkN1c3RvbWVyVXNlciIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmF2IiB2YWx1ZT0iTm9uZSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV2hhdCIgdmFsdWU9IiIvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+CjxkaXYgaWQ9IkN1c3RvbWVyVGlja2V0cyI+PC9kaXY+Cg==
IyAtLQojIEFnZW50VGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuMiAyMDA5LzA3LzAyIDIyOjAyOjAxIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuMjQgMjAwOS8wMi8xNiAxMTowNzoyNSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICRRRGF0YXsiVGlja2V0TnVtYmVyIn0gLyAkUURhdGF7IlRpdGxlIn08L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMTAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAkVGV4dHsiVGlja2V0LUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNDAlIj4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KIyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgojICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlF1ZXVlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlF1ZXVlIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTG9jayJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJMb2NrIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3VzdG9tZXJJRCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik93bmVyIn0gKCRRRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiVXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJSZXNwb25zaWJsZVN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU0xBIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNlcnZpY2UgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNDAlIj4kVGV4dHsiQWdlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iNjAlIj4kUURhdGF7IkFnZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0VGltZVVuaXRzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyB0aWxsIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lU2hvcnR7IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICA8L3RyPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyMCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjIwIn08L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICA8dHI+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjAifTo8L3RkPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyMCJ9PC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAkVGV4dHsiTGlua2VkLU9iamVjdCJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGUgLS0+CiAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IiREYXRheyJMaW5rVHlwZU5hbWUifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUeXBlUm93IC0tPgogICAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1N0cmcifTxicj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUeXBlIC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJDdXN0b21lciBJbmZvIn06CiAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBzdGFydCB0aWNrZXQgJERhdGF7IlRpY2tldE51bWJlciJ9IC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogIDx0cj4KICAgIDx0ZD4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyBGcm9tOiwgVG86LCBDYzoKPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9ICRUZXh0eyJieSJ9ICREYXRheyJTZW5kZXJUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgc2hvdyB0aGUgQXJ0aWNsZTo6RnJlZUtleTEtMyBhbmQgQXJ0aWNsZTo6RnJlZVRleHQxLTMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxNjAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IkFydGljbGVUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJBcnRpY2xlOjpBVE0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KJERhdGF7IlRleHROb3RlIn0KICAgICAgICAgICAgICAgICAgPHByZT4KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8YnIvPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0UHJpb3JpdHkuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBwcmlvcml0eSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW9yaXR5LmR0bCx2IDEuNCAyMDEwLzAxLzIwIDEzOjU0OjU1IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW9yaXR5LmR0bCx2IDEuMjYuMi40IDIwMDkvMTIvMDggMDk6MTU6MDggbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTQojIC0tLQokSW5jbHVkZXsiQUpBWCJ9CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgogICAgLy8gaWYgUmljaFRleHQgaXMgZW5hYmxlZCwgdXBkYXRlIHRoZSBoaWRkZW4gdGV4dGFyZWEgbm93IGZvciB0aGUgYm9keSBjb250ZW50IGNoZWNrIHRvIHdvcmsgY29ycmVjdGx5CiAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQoKTsKICAgIH0KCiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFJpY2hUZXh0Rm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICcgKyBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifS52YWx1ZSArICchJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0gJiYgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmNoZWNrZWQgPT0gZmFsc2UpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0hJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlICE9ICIiKSB7CiAgICAgICAgdmFyIHJlZyA9IC9eLXswLDF9XGQrPygoXC58LCl7MCwxfVxkKz8pezAsMX0kLzsKICAgICAgICBpZiAocmVnLnRlc3QoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUpID09IGZhbHNlKSB7CiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIHRpbWUhIn0nKTsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlID09ICIiICYmICRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lIn0pIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiWW91IG5lZWQgdG8gYWNjb3VudCB0aW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgoKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykubGVuZ3RoKSB7CiAgICAgICAgLy8gbmV3IG93bmVyCiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDApLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5OZXdPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIHByZXZpb3VzIG93bmVyCiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMSkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk9sZE93bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIFNwZWxsQ2hlY2tTdWJtaXQoKSB7CiAgICBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdzcGVsbGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5zcGVsbGluZy5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gY2hhbmdlX3NlbGVjdGVkKHNlbCkgewogICAgc3RhcnRfZWxlbWVudHMgPSAoc2VsICsgNCk7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1swXS5uYW1lID09ICIkQ29uZmlneyJTZXNzaW9uTmFtZSJ9IikgewogICAgICAgIHN0YXJ0X2VsZW1lbnRzID0gc3RhcnRfZWxlbWVudHMgKyAxOwogICAgfQogICAgaWYgKCFkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkKSB7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCA9IHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+CjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNoYW5nZSBwcmlvcml0eSBvZiB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn13YXJuaW5nLnBuZyIgYWx0PSIkVGV4dHsiSW5mbyJ9Ij46IDxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJUaWNrZXQgbG9ja2VkISJ9PC9mb250PgogICAgICAgICAgICAoPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldExvY2smU3ViYWN0aW9uPVVubG9jayZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlRpY2tldCB1bmxvY2shIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiVGlja2V0IHVubG9jayEifTwvYT4pCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU2VydmljZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iTmV3IiAkRGF0YXsiTmV3T3duZXJUeXBlOjpOZXcifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXNwb25zaWJsZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inl1aS1za2luLXNhbSI+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3IifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTdGF0ZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0UmVzcG9uc2libGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciByZXNwb25zaWJsZSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLmR0bCx2IDEuNSAyMDEwLzAxLzIwIDEzOjU0OjU1IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLmR0bCx2IDEuMjEuMi40IDIwMDkvMTIvMDggMDk6MTU6MDkgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTQojIC0tLQokSW5jbHVkZXsiQUpBWCJ9CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgogICAgLy8gaWYgUmljaFRleHQgaXMgZW5hYmxlZCwgdXBkYXRlIHRoZSBoaWRkZW4gdGV4dGFyZWEgbm93IGZvciB0aGUgYm9keSBjb250ZW50IGNoZWNrIHRvIHdvcmsgY29ycmVjdGx5CiAgICBpZiAodHlwZW9mIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIFJpY2hUZXh0VXBkYXRlTGlua2VkRmllbGQoKTsKICAgIH0KCiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFJpY2hUZXh0Rm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICcgKyBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifS52YWx1ZSArICchJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0gJiYgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmNoZWNrZWQgPT0gZmFsc2UpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0hJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlICE9ICIiKSB7CiAgICAgICAgdmFyIHJlZyA9IC9eLXswLDF9XGQrPygoXC58LCl7MCwxfVxkKz8pezAsMX0kLzsKICAgICAgICBpZiAocmVnLnRlc3QoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUpID09IGZhbHNlKSB7CiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIHRpbWUhIn0nKTsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlID09ICIiICYmICRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lIn0pIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiWW91IG5lZWQgdG8gYWNjb3VudCB0aW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0pzIC0tPgoKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnTmV3T3duZXJUeXBlJykubGVuZ3RoKSB7CiAgICAgICAgLy8gbmV3IG93bmVyCiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdOZXdPd25lclR5cGUnKS5pdGVtKDApLmNoZWNrZWQKICAgICAgICAgICAgJiYgZG9jdW1lbnQuY29tcG9zZS5OZXdPd25lcklELnZhbHVlID09ICcnKSB7CgogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIHByZXZpb3VzIG93bmVyCiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ05ld093bmVyVHlwZScpLml0ZW0oMSkuY2hlY2tlZAogICAgICAgICAgICAmJiBkb2N1bWVudC5jb21wb3NlLk9sZE93bmVySUQudmFsdWUgPT0gJycpIHsKCiAgICAgICAgICAgIGFsZXJ0KCckSlNUZXh0eyJQbGVhc2Ugc2V0IGEgbmV3IG93bmVyISJ9Jyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIFNwZWxsQ2hlY2tTdWJtaXQoKSB7CiAgICBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdzcGVsbGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5zcGVsbGluZy5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gY2hhbmdlX3NlbGVjdGVkKHNlbCkgewogICAgc3RhcnRfZWxlbWVudHMgPSAoc2VsICsgNCk7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1swXS5uYW1lID09ICIkQ29uZmlneyJTZXNzaW9uTmFtZSJ9IikgewogICAgICAgIHN0YXJ0X2VsZW1lbnRzID0gc3RhcnRfZWxlbWVudHMgKyAxOwogICAgfQogICAgaWYgKCFkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkKSB7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCA9IHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+CjwhLS0gZHRsOmJsb2NrOk93bmVySnMgLS0+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNoYW5nZSByZXNwb25zaWJsZSBvZiB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn13YXJuaW5nLnBuZyIgYWx0PSIkVGV4dHsiSW5mbyJ9Ij46IDxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJUaWNrZXQgbG9ja2VkISJ9PC9mb250PgogICAgICAgICAgICAoPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldExvY2smU3ViYWN0aW9uPVVubG9jayZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlRpY2tldCB1bmxvY2shIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiVGlja2V0IHVubG9jayEifTwvYT4pCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU2VydmljZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iTmV3IiAkRGF0YXsiTmV3T3duZXJUeXBlOjpOZXcifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXNwb25zaWJsZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inl1aS1za2luLXNhbSI+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3IifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTdGF0ZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvciBBZ2VudFRpY2tldFpvb20ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0Wm9vbS5kdGwsdiAxLjEyIDIwMTAvMDEvMzEgMTY6NDI6MzkgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0Wm9vbS5kdGwsdiAxLjYyLjIuMiAyMDEwLzAxLzMxIDE2OjQxOjAxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgoKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZpbHRlckRpYWxvZyAtLT4KJEluY2x1ZGV7IkFnZW50VGlja2V0Wm9vbUFydGljbGVGaWx0ZXJEaWFsb2cifQo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyRGlhbG9nIC0tPgoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgo8IS0tIHN0YXJ0IHRpY2tldCBoZWFkICREYXRheyJUaWNrZXROdW1iZXIifSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJab29tIn0gJENvbmZpZ3siVGlja2V0OjpIb29rIn06ICREYXRheyJUaWNrZXROdW1iZXIifSAkRW52eyJCb3gxIn0KICAgICAgICAgICAgJFFEYXRheyJUaXRsZSIsIjYwIn0KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIzMCUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJBZ2UifTogJERhdGF7IkFnZSJ9JEVudnsiQm94MSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgICAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIzMCUiIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOkJvZHkgLS0+CiAgICA8dHI+CiAgICAgICAgPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpUcmVlIC0tPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkhpZ2hsaWdodFN0eWxlIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQXJ0aWNsZSJ9ICRUZXh0eyJGaWx0ZXIifToKICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIiBpZD0iU2V0QXJ0aWNsZUZpbHRlciIgb25jbGljaz0icmV0dXJuIGZhbHNlOyI+JFRleHR7IlNldCJ9PC9hPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyUmVzZXRMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiIGlkPSJSZXNldEFydGljbGVGaWx0ZXIiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiPiRUZXh0eyJSZXNldCJ9PC9hPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyUmVzZXRMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyRGlhbG9nTGluayAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J2hpZ2hsaWdodCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0nJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9JzsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkZyb20iLCI3MCJ9OiAkUURhdGF7IlN1YmplY3QiLCIyMDAifSAtICRUaW1lU2hvcnR7IiRRRGF0YXsiQ3JlYXRlZCJ9In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlN0YXJ0MiJ9JERhdGF7IlNwYWNlIn0kRGF0YXsiU3RvcDIifSREYXRheyJTdGFydCJ9JERhdGF7IlN0YXJ0MiJ9Jm5ic3A7JFFEYXRheyJDb3VudCJ9LiZuYnNwOyREYXRheyJTdG9wMiJ9Jm5ic3A7PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9Jlpvb21FeHBhbmQ9JExRRGF0YXsiWm9vbUV4cGFuZCJ9IyRRRGF0YXsiQXJ0aWNsZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7IlNlbmRlclR5cGUifSJ9ICgkVGV4dHsiJFFEYXRheyJBcnRpY2xlVHlwZSJ9In0pJzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IiRRRGF0YXsiU2VuZGVyVHlwZSJ9In0mbmJzcDsoJFRleHR7IiRRRGF0YXsiQXJ0aWNsZVR5cGUifSJ9KTwvYT4kRGF0YXsiU3RvcCJ9CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtRW1haWwgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFBsYWluJlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InBsYWluIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiB0aXRsZT0iJFRleHR7InBsYWluIn0iPiRUZXh0eyJwbGFpbiJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1FbWFpbCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTdGFydCJ9JFFEYXRheyJGcm9tIiwiMzQifTogJFFEYXRheyJTdWJqZWN0IiwiMzYifSREYXRheyJTdG9wIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm9icj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50TW9yZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy4uXQo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRNb3JlIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkNHSUhhbmRsZSJ9LyRMUURhdGF7IkZpbGVuYW1lIn0/QWN0aW9uPUFnZW50VGlja2V0QXR0YWNobWVudCZBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifSZGaWxlSUQ9JFFEYXRheyJGaWxlSUQifSIgdGl0bGU9IiRRRGF0YXsiRmlsZW5hbWUifSAtICRRRGF0YXsiRmlsZXNpemUifSIgJERhdGF7IlRhcmdldCJ9PjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWF0dGFjaC1zbWFsbC5wbmciPjwvYT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25vYnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm9icj4kRGF0YXsiU3RhcnQifSRUaW1lU2hvcnR7IiRRRGF0YXsiQ3JlYXRlZCJ9In0kRGF0YXsiU3RvcCJ9PC9ub2JyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgICAgICAgPGhyIHNpemU9IjIiPgogICAgICAgICAgICA8YSBuYW1lPSIkUURhdGF7IkFydGljbGVJRCJ9Ij48L2E+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTglIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgojIEZyb206LCBUbzosIENjOgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjIwMCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9Ij4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgdGhlIEFydGljbGVGcmVlS2V5MS0zIGFuZCBBcnRpY2xlRnJlZVRleHQxLTMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTYwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojIHNob3cgQXJ0aWNsZUZyZWVLZXkxLTMgYW5kIEFydGljbGVGcmVlVGV4dDEtMyAoaW4gb3RoZXIgd2F5IGxpa2UgdGhlIGJsb2NrLCBzbyB5b3UgY291bGQgYWRkIGxpbmsgb3Igc29tZXRoaW4gZWxzZSkKIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQxIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMiJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQyIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQzIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0KCiMgc2hvdyBhcnRpY2xlIG9wdGlvbnMgbGlrZSBzaWduZWQsIGNyeXB0ZWQsIC4uLgo8IS0tIGR0bDpibG9jazpBcnRpY2xlT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IlN1Y2Nlc3NmdWwifSBlcSAiMCIpIHsgJERhdGF7IlN0YXJ0Rm9udCJ9ID0gIjxmb250IGNvbG9yPSJyZWQiPiI7IH0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIwIikgeyAkRGF0YXsiU3RvcEZvbnQifSA9ICI8L2ZvbnQ+IjsgfT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjEiKSB7ICREYXRheyJTdGFydEZvbnQifSA9ICI8Zm9udCBjb2xvcj0iZ3JlZW4iPiI7IH0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIxIikgeyAkRGF0YXsiU3RvcEZvbnQifSA9ICI8L2ZvbnQ+IjsgfT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kRGF0YXsiU3RhcnRGb250In0kUURhdGF7IlZhbHVlIiwiMTYwIn0kRGF0YXsiU3RvcEZvbnQifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlT3B0aW9uIC0tPgojIHNob3cgYXR0YWNobWVudHMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRGF0YXsiTGluayJ9IiAkRGF0YXsiVGFyZ2V0In0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiQWN0aW9uIn0ifTogJEpTVGV4dHsiJFFEYXRheyJGaWxlbmFtZSJ9In0nO3JldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkltYWdlIn0iIGJvcmRlcj0iMCIgYWx0PSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSI+PC9hPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Cgo8IS0tIGR0bDpibG9jazpCb2R5UGxhaW4gLS0+CiREYXRheyJCb2R5Tm90ZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgokRGF0YXsiQm9keSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpCb2R5UGxhaW4gLS0+CjwhLS0gZHRsOmJsb2NrOkJvZHlIVE1MIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQveWFob28veWFob28tbWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9kb20vZG9tLW1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQvZXZlbnQvZXZlbnQtbWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9lbGVtZW50L2VsZW1lbnQtbWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSWZyYW1lQXV0b0hlaWdodCggSWZyYW1lSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRG9tID0gWUFIT08udXRpbC5Eb207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWZyYW1lID0gbmV3IFlBSE9PLnV0aWwuRWxlbWVudCggSWZyYW1lSUQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBpZnJhbWUuZ2V0KCdlbGVtZW50JykuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW5ld0hlaWdodCB8fCBpc05hTiggbmV3SGVpZ2h0ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodERlZmF1bHQifTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBuZXdIZWlnaHQgPiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodE1heCJ9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHRNYXgifTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbS5zZXRTdHlsZShpZnJhbWUsICdoZWlnaHQnLCBuZXdIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSB3aWR0aD0iMTAwJSIgZnJhbWVib3JkZXI9IjAiIGJvcmRlcj0iMCIgbWFyZ2lud2lkdGg9IjAiIG1hcmdpbmhlaWdodD0iMCIgbGVmdG1hcmdpbj0iMCIgdG9wbWFyZ2luPSIwIiBzdHlsZT0id2lkdGg6IDEwMCU7IiBpZD0iaWZyYW1lJFFEYXRheyJBcnRpY2xlSUQifSIgb25sb2FkPSJJZnJhbWVBdXRvSGVpZ2h0KCdpZnJhbWUkUURhdGF7IkFydGljbGVJRCJ9Jyk7IiBzcmM9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50JlN1YmFjdGlvbj1IVE1MVmlldyZBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifSZGaWxlSUQ9JFFEYXRheyJBdHRhY2htZW50SURPZkhUTUxCb2R5In0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Qm9keUhUTUwgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgo8IS0tIGR0bDpibG9jazpFeHBhbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJFeHBhbmQgVmlldyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifSZab29tRXhwYW5kPTEiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJFeHBhbmQgVmlldyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZXhwYW5kLnBuZyI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RXhwYW5kIC0tPgo8IS0tIGR0bDpibG9jazpDb2xsYXBzZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IkNvbGxhcHNlIFZpZXcifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn0mWm9vbUV4cGFuZD0wIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQ29sbGFwc2UgVmlldyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9Y29sbGFwc2UucG5nIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDb2xsYXBzZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgICAgICAgPGhyIHNpemU9IjIiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iOTglIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjI1JSIgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPgojIHNob3cgdGlja2V0IHN0YXR1cyAoc3RhdGUsIGxvY2ssIC4uLikKIyAtLS0KIyBJVFNNCiMgLS0tCiM8IS0tIGR0bDpibG9jazpTdGF0dXMgLS0+CiMgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KIzwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiMgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJUeXBlIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVHlwZSJ9Ij4kUURhdGF7IlR5cGUiLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiMgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTdGF0ZSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSIsIjE4In08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KIyAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiTG9ja2VkIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkxvY2sifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSIsIjE4In08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KIyAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUHJpb3JpdHkifTo8L2I+PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CiMgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlF1ZXVlIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJRdWV1ZSJ9Ij4kUURhdGF7IlF1ZXVlIiwiMTgifTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPC9mb250PgojICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU2VydmljZSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlNlcnZpY2UifSI+JFFEYXRheyJTZXJ2aWNlIiwiMTgifTwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgojPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU0xBIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMTgifTwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpTTEEgLS0+CiM8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KIyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L2I+PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RhcnQgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KIzwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUifSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUh1bWFuIn0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2hvcnR7IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wIC0tPgojICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiMgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiM8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9Ij4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RvcCAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RvcCAtLT4KIyAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KIyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L2I+PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0YXJ0IC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RvcCAtLT4KIyAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkQ29uZmlneyJDdXN0b21lckRCTGluayJ9IiAkQ29uZmlneyJDdXN0b21lckRCTGlua1RhcmdldCJ9PiRRdW90ZXsiJERhdGF7IkN1c3RvbWVySUQifSIsIjE4In08L2E+CiMgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiVGlja2V0VGltZVVuaXRzIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiMjIHVzZSB0aWNrZXQgaXMgcGVuZGluZwojICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJQZW5kaW5nVW50aWwifSBuZSAiIikgeyAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0gPSAiPHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvYj48L3RkPjx0ZD4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICAgICAgICAgICAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0KIzwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgojICAgICAgICAgICAgICAgIDx0ciAgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7Ik93bmVyIn06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRRGF0YXsiVXNlckZpcnN0bmFtZSJ9JFFEYXRheyJVc2VyTGFzdG5hbWUifSkiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlckxvZ2luIiwiMTgifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjE4In0pCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiM8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KIyAgICAgICAgICAgICAgICA8dHIgIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJMb2dpbiJ9ICgkUURhdGF7IlVzZXJGaXJzdG5hbWUifSRRRGF0YXsiVXNlckxhc3RuYW1lIn0pIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjE4In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxOCJ9KQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojIyBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyNSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+PGEgaHJlZj0iJERhdGF7IlRpY2tldEZyZWVUZXh0TGluayJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2E+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiMgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyMgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjI1In06PC9iPjwvdGQ+CiMjICAgICAgICAgICAgPHRkPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4xIC0tPgojIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyNSJ9PC9kaXY+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMSAtLT4KIyMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazEifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvYT48L2Rpdj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsxIC0tPgojIyAgICAgICAgICAgIDwvdGQ+CiMjICAgICAgICAgIDwvdHI+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyMgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MiIsIjI1In06PC9iPjwvdGQ+CiMjICAgICAgICAgICAgPHRkPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9kaXY+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIyMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazIifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIiwiMjUifTwvYT48L2Rpdj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsyIC0tPgojIyAgICAgICAgICAgIDwvdGQ+CiMjICAgICAgICAgIDwvdHI+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojCiMjIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZVRpbWUxLTYKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9iPjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMjICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMjICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvYj48L3RkPgojIyAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifTwvZGl2PjwvdGQ+CiMjICAgICAgICAgIDwvdHI+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC9iPjwvdGQ+CiMjICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMKIyMgb2JqZWN0IGxpbmtzCiM8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiMgICAgICAgICAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQojPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgojICAgICAgICAgICAgPC90YWJsZT4KIyMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCiM8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgojICAgICAgICAgICAgPHA+CiMgICAgICAgICAgICAgICAgPGhyPgojICAgICAgICAgICAgICAgIDxiPiRUZXh0eyJDdXN0b21lciBJbmZvIn06PC9iPgojICAgICAgICAgICAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KIyAgICAgICAgICAgICAgICA8aHI+CiMgICAgICAgICAgICA8L3A+CiM8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgojPCEtLSBkdGw6YmxvY2s6U3RhdHVzIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0dXMgLS0+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlR5cGUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVHlwZSJ9Ij4kUURhdGF7IlR5cGUiLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU3RhdGUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJRdWV1ZSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb250PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkxvY2tlZCJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiTG9jayJ9In0iLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICA8dHIgIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7Ik93bmVyIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJMb2dpbiJ9ICgkUURhdGF7IlVzZXJGaXJzdG5hbWUifSRRRGF0YXsiVXNlckxhc3RuYW1lIn0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlckxvZ2luIiwiMTgifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjE4In0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICA8dHIgIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJMb2dpbiJ9ICgkUURhdGF7IlVzZXJGaXJzdG5hbWUifSRRRGF0YXsiVXNlckxhc3RuYW1lIn0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlckxvZ2luIiwiMTgifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjE4In0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KIyB1c2UgdGlja2V0IGlzIHBlbmRpbmcKICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJQZW5kaW5nVW50aWwifSBuZSAiIikgeyAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0gPSAiPHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvYj48L3RkPjx0ZD4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPjwvdHI+IjsgfT4KICAgICAgICAgICAgICAgICREYXRheyJQZW5kaW5nVW50aWxTdHJpbmcifQo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTZXJ2aWNlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlNlcnZpY2UifSI+JFFEYXRheyJTZXJ2aWNlIiwiMTgifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU0xBIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlNMQSJ9Ij4kUURhdGF7IlNMQSIsIjE4In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJGaXJzdCBSZXNwb25zZSBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVIdW1hbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiVXBkYXRlIFRpbWUifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiVXBkYXRlVGltZVdvcmtpbmdUaW1lIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb250Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJTb2x1dGlvblRpbWVXb3JraW5nVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiU29sdXRpb25UaW1lSHVtYW4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJJbXBhY3QifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUHJpb3JpdHkifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiRGVjaXNpb24gUmVzdWx0In06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUZXh0MTYiLCIyMCJ9In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTUifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNSJ9In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTMifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMyJ9In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTQifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNCJ9In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTYifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWU2In0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyNSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+PGEgaHJlZj0iJERhdGF7IlRpY2tldEZyZWVUZXh0TGluayJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2E+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmsifSIgJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmtUYXJnZXQifT4kUXVvdGV7IiREYXRheyJDdXN0b21lcklEIn0iLCIxOCJ9PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgoKIyBvYmplY3QgbGlua3MKPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICAgICAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGhyPgogICAgICAgICAgICAgICAgPGI+JFRleHR7IkN1c3RvbWVyIEluZm8ifTo8L2I+CiAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICAgICAgICAgICAgICA8aHI+CiAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdHVzIC0tPgojIC0tLQogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSI5NSUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KIyBzaG93IGNvbXBvc2UgbGlua3MKPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXIgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyQ29tcG9zZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ29tcG9zZSBBbnN3ZXIifSAoJFRleHR7ImVtYWlsIn0pOjwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTdGRSZXNwb25zZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlckNvbXBvc2UgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyUGhvbmVPdXRib3VuZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ29udGFjdCBjdXN0b21lciJ9ICgkVGV4dHsicGhvbmUifSk6PC9iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9JlF1ZXVlSUQ9JERhdGF7IlF1ZXVlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlBob25lIGNhbGwifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJQaG9uZSBjYWxsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgokRGF0YXsiQWdlbnRQaG9uZVN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyUGhvbmVPdXRib3VuZCAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXIgLS0+CiMgc2hvdyBhcnRpY2xlIGxpbmtzCjwhLS0gZHRsOmJsb2NrOkFnZW50QXJ0aWNsZUNvbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQXJ0aWNsZSJ9OjwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojIGNoZWNrIGlmIHByaW50IHNob3VsZCBiZSBzaG93bgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QcmludCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRQcmludCZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JERhdGF7IkFydGljbGVJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiUHJpbnQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIHRhcmdldD0icHJpbnQiPiRUZXh0eyJQcmludCJ9PC9hPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QcmludCAtLT4KIyBjaGVjayBpZiBmb3J3YXJkIHNob3VsZCBiZSBzaG93bgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21Gb3J3YXJkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldEZvcndhcmQmVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifSZRdWV1ZUlEPSREYXRheyJRdWV1ZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJGb3J3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiRm9yd2FyZCJ9PC9hPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21Gb3J3YXJkIC0tPgojIGNoZWNrIGlmIGJvdW5jZSBzaG91bGQgYmUgc2hvd24KPCEtLSBkdGw6YmxvY2s6QWdlbnRBcnRpY2xlQ29tQm91bmNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IkFydGljbGVUeXBlIn0gZXEgImVtYWlsLWV4dGVybmFsIikgeyAkRGF0YXsiQXJ0aWNsZUJvdW5jZVN0cmluZyJ9ID0gIkJvdW5jZSI7IH0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU2VuZGVyVHlwZSJ9IG5lICJjdXN0b21lciIpIHsgJERhdGF7IkFydGljbGVCb3VuY2VTdHJpbmcifSA9ICIiOyB9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldEJvdW5jZSZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JERhdGF7IkFydGljbGVJRCJ9JlF1ZXVlSUQ9JERhdGF7IlF1ZXVlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJvdW5jZSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IiREYXRheyJBcnRpY2xlQm91bmNlU3RyaW5nIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBcnRpY2xlQ29tQm91bmNlIC0tPgojIGNoZWNrIGlmIHNwbGl0IHNob3VsZCBiZSBzaG93bgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QaG9uZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTZW5kZXJUeXBlIn0gZXEgImN1c3RvbWVyIikgeyAkRGF0YXsiQXJ0aWNsZVNwbGl0U3RyaW5nIn0gPSAiU3BsaXQiOyB9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFBob25lJkFydGljbGVJRD0kRGF0YXsiQXJ0aWNsZUlEIn0mUXVldWVJRD0kRGF0YXsiUXVldWVJRCJ9JkxpbmtUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGxpdCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IiREYXRheyJBcnRpY2xlU3BsaXRTdHJpbmcifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QaG9uZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb20gLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0iUHJpb3JpdHlJRC0kRGF0YXsiUHJpb3JpdHlJRCJ9Ij4KPCEtLSBkdGw6YmxvY2s6TW92ZSAtLT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ2hhbmdlIHF1ZXVlIn06PC9iPjxici8+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IiRRRGF0YXsiUXVldWVJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTW92ZVF1ZXVlc1N0cmcifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTW92ZSJ9Ii8+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6TW92ZSAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KPCEtLSBkdGw6YmxvY2s6Rm9vdGVyIC0tPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpGb290ZXIgLS0+Cg==
IyAtLQojIEN1c3RvbWVyVGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuMiAyMDA5LzA3LzAyIDIyOjAzOjIzIHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuMTEgMjAwOS8wMi8xNiAxMTowNzoyNSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICRRRGF0YXsiVGlja2V0TnVtYmVyIn0gLyAkUURhdGF7IlRpdGxlIn08L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMTAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAkVGV4dHsiVGlja2V0LUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNDAlIj4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KIyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgojICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlF1ZXVlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlF1ZXVlIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTG9jayJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJMb2NrIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3VzdG9tZXJJRCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik93bmVyIn0gKCRRRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiVXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJSZXNwb25zaWJsZVN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU0xBIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNlcnZpY2UgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNDAlIj4kVGV4dHsiQWdlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iNjAlIj4kUURhdGF7IkFnZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0VGltZVVuaXRzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyB0aWxsIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lU2hvcnR7IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICA8L3RyPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyMCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjIwIn08L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICA8dHI+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjAifTo8L3RkPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyMCJ9PC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAkVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9OgogICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gc3RhcnQgdGlja2V0ICREYXRheyJUaWNrZXROdW1iZXIifSAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjMDAwMDAwIiBjbGFzcz0iY29udGFpbmVyIj4KICA8dHI+CiAgICA8dGQ+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEiIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTAwJSIgY2xhc3M9InNtYWxsIj4KICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxNjAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifSAkVGV4dHsiYnkifSAkRGF0YXsiU2VuZGVyVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTYwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJBcnRpY2xlVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiQXJ0aWNsZTo6QVRNIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiREYXRheyJUZXh0Tm90ZSJ9CiAgICAgICAgICAgICAgICAgIDxwcmU+CiREYXRheyJCb2R5In0KICAgICAgICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZW5kIHRpY2tldCAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPGJyLz4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZSAtLT4K
IyAtLQojIEN1c3RvbWVyVGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIFRpY2tldFpvb20gZm9yIEN1c3RvbWVyVGlja2V0Wm9vbS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRab29tLmR0bCx2IDEuOSAyMDA5LzEwLzAyIDA3OjI2OjQ2IHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFpvb20uZHRsLHYgMS40NC4yLjMgMjAwOS8xMC8wMSAxNDoxNDoxNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBzdGFydCB0aWNrZXQgJERhdGF7IlRpY2tldE51bWJlciJ9IC0tPgo8IS0tIFRoaXMgamF2YSBzY3JpcHQgaXMganVzdCBmb3IgbmljZSB0byBoYXZlIGZ1bmt0aW9ucyEgLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICAvLyBpZiBSaWNoVGV4dCBpcyBlbmFibGVkLCB1cGRhdGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgZm9yIHRoZSBib2R5IGNvbnRlbnQgY2hlY2sgdG8gd29yayBjb3JyZWN0bHkKICAgIGlmICh0eXBlb2YgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgUmljaFRleHRVcGRhdGVMaW5rZWRGaWVsZCgpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgaWYgKHR5cGVvZiBSaWNoVGV4dFVwZGF0ZUxpbmtlZEZpZWxkID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgUmljaFRleHRGb2N1cygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIHdpZHRoPSI1MCUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJab29tIn0gJENvbmZpZ3siVGlja2V0OjpIb29rIn06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjUwJSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFnZSJ9OiAkRGF0YXsiQWdlIn0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1DdXN0b21lclRpY2tldFByaW50JlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlByaW50In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiB0YXJnZXQ9Il9ibGFuayI+JFRleHR7IlByaW50In08L2E+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMzAlIiBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxiPiRUZXh0eyJDcmVhdGVkIn06PC9iPiAkVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NSUiIGNsYXNzPSJzbWFsbCI+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbSAtLT4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J2hpZ2hsaWdodCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0nJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9JzsiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkZyb20iLCI1MCJ9OiAkUURhdGF7IlN1YmplY3QiLCIyMDAifSAtICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVkIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiU3RhcnQyIn0kRGF0YXsiU3BhY2UifSREYXRheyJTdG9wMiJ9JERhdGF7IlN0YXJ0In0kRGF0YXsiU3RhcnQyIn0mbmJzcDskUURhdGF7IkNvdW50In0uJm5ic3A7JERhdGF7IlN0b3AyIn0mbmJzcDs8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUN1c3RvbWVyVGlja2V0Wm9vbSZUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn0jJFFEYXRheyJBcnRpY2xlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiU2VuZGVyVHlwZSJ9In0gKCRUZXh0eyIkUURhdGF7IkFydGljbGVUeXBlIn0ifSknOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiJFFEYXRheyJTZW5kZXJUeXBlIn0ifSAoJFRleHR7IiRRRGF0YXsiQXJ0aWNsZVR5cGUifSJ9KTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRnJvbSIsIjI0In06ICRRRGF0YXsiU3ViamVjdCIsIjMwIn0kRGF0YXsiU3RvcCJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG5vYnI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudE1vcmUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIFsuLl0KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50TW9yZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDs8YSBocmVmPSIkRW52eyJDR0lIYW5kbGUifS8kTFFEYXRheyJGaWxlbmFtZSJ9P0FjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQmQXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn0mRmlsZUlEPSRRRGF0YXsiRmlsZUlEIn0iIHRpdGxlPSIkUURhdGF7IkZpbGVuYW1lIn0gLSAkUURhdGF7IkZpbGVzaXplIn0iICREYXRheyJUYXJnZXQifT48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1hdHRhY2gtc21hbGwucG5nIj48L2E+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9ub2JyPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG5vYnI+JERhdGF7IlN0YXJ0In0kVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlZCJ9In0kRGF0YXsiU3RvcCJ9PC9ub2JyPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbSAtLT4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgICAgICAgPGhyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIyMDAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiMgc2hvdyB0aGUgQXJ0aWNsZTo6RnJlZUtleTEtMyBhbmQgQXJ0aWNsZTo6RnJlZVZhbHVlMS0zCiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQXJ0aWNsZUZyZWVUZXh0MSJ9PC90ZD48L3RyPiI7IH0+CiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMiJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQXJ0aWNsZUZyZWVUZXh0MiJ9PC90ZD48L3RyPiI7IH0+CiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQXJ0aWNsZUZyZWVUZXh0MyJ9PC90ZD48L3RyPiI7IH0+CiAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcxIn0KICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQogICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9CiMgc2hvdyBhdHRhY2htZW50cwo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiREYXRheyJMaW5rIn0iICREYXRheyJUYXJnZXQifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9OiAkUURhdGF7IkZpbGVuYW1lIn0nO3JldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkltYWdlIn0iIGJvcmRlcj0iMCIgYWx0PSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSI+PC9hPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxwPgo8IS0tIGR0bDpibG9jazpCb2R5UGxhaW4gLS0+CiREYXRheyJBcnRpY2xlOjpUZXh0Tm90ZSJ9CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KJERhdGF7IkFydGljbGU6OlRleHQifQogICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkJvZHlQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6Qm9keUhUTUwgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL3lhaG9vL3lhaG9vLW1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2RvbS9kb20tbWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQvZXZlbnQvZXZlbnQtbWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQvZWxlbWVudC9lbGVtZW50LW1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSWZyYW1lQXV0b0hlaWdodCggSWZyYW1lSUQgKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIERvbSA9IFlBSE9PLnV0aWwuRG9tOwogICAgICAgICAgICAgICAgICAgIHZhciBpZnJhbWUgPSBuZXcgWUFIT08udXRpbC5FbGVtZW50KCBJZnJhbWVJRCApOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBpZnJhbWUuZ2V0KCdlbGVtZW50JykuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgICAgICAgICAgICAgICAgICBpZiAoICFuZXdIZWlnaHQgfHwgaXNOYU4oIG5ld0hlaWdodCApICkgewogICAgICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9ICRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OkhUTUxBcnRpY2xlSGVpZ2h0RGVmYXVsdCJ9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbmV3SGVpZ2h0ID4gJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6SFRNTEFydGljbGVIZWlnaHRNYXgifSApIHsKICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodE1heCJ9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEb20uc2V0U3R5bGUoaWZyYW1lLCAnaGVpZ2h0JywgbmV3SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8tLT4KICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHdpZHRoPSIxMDAlIiBmcmFtZWJvcmRlcj0iMCIgYm9yZGVyPSIwIiBtYXJnaW53aWR0aD0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGlkPSJpZnJhbWUkUURhdGF7IkFydGljbGVJRCJ9IiBvbmxvYWQ9IklmcmFtZUF1dG9IZWlnaHQoJ2lmcmFtZSRRRGF0YXsiQXJ0aWNsZUlEIn0nKTsiIHNyYz0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQmU3ViYWN0aW9uPUhUTUxWaWV3JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9JkZpbGVJRD0kUURhdGF7IkF0dGFjaG1lbnRJRE9mSFRNTEJvZHkifSI+PC9pZnJhbWU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Qm9keUhUTUwgLS0+CiAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6Rm9sbG93VXAgLS0+CiAgICAgICAgICAgIDxocj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkN1c3RvbWVyVGlja2V0Wm9vbSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSIkUURhdGF7IkFydGljbGU6OkFydGljbGVJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inl1aS1za2luLXNhbSI+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3IifQojIHNldCB3aGl0ZSBiYWNrZ3JvdW5kIGZvciBidXR0b25zCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CjwhLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAueXVpLXNraW4tc2FtIC55dWktdG9vbGJhci1jb250YWluZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgbmFtZT0iQm9keSIgcm93cz0iMTUiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7Ik5leHRTdGF0ZXNTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdFJpY2hUZXh0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwIC0tPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSIyNSUiIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iOTUlIj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlR5cGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJUeXBlIn0ifSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9IiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJRdWV1ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRRGF0YXsiU2VydmljZSJ9Ij4kUURhdGF7IlNlcnZpY2UiLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFFEYXRheyJTTEEifSI+JFFEYXRheyJTTEEiLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFFEYXRheyJDdXN0b21lcklEIn0iPiRRRGF0YXsiQ3VzdG9tZXJJRCIsIjE4In08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAgICAgIDx0cj4KIyAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWNjb3VudGVkIHRpbWUifTo8L3RkPgojICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldFRpbWVVbml0cyJ9PC90ZD4KIyAgICAgIDwvdHI+CiMgICAgICA8dHI+CiMgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KIyAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRRRGF0YXsiT3duZXIifSI+JFFEYXRheyJPd25lciIsIjE4In08L2Rpdj48L3RkPgojICAgICAgPC90cj4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlS2V5MS0xNiBhbmQgVGlja2V0RnJlZVRleHQxLTE2CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5IiwiMjAifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjAifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjIwIn06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjAifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTIiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgoKICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGlja2V0T3ZlcnZpZXdNZWRpdW0ucG0sdiAxLjIgMjAxMC8wMi8xMSAyMjoxNjo1MSB1YiBFeHAgJAojICRPbGRJZDogVGlja2V0T3ZlcnZpZXdNZWRpdW0ucG0sdiAxLjE0LjIuMSAyMDEwLzAyLzAxIDAwOjU3OjM4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0T3ZlcnZpZXdNZWRpdW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBcJVBhcmFtOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFRpY2tldE9iamVjdCBNYWluT2JqZWN0IFF1ZXVlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUaWNrZXRIZWFkZXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CiAgICBteSAkT3V0cHV0TWV0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bU1ldGEnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgICA9ICcnOwogICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgbXkgJENvdW50ZXJPblNpdGUgPSAwOwogICAgbXkgQFRpY2tldElEc1Nob3duOwogICAgZm9yIG15ICRUaWNrZXRJRCAoIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CiAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICBpZiAoICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0gJiYgJENvdW50ZXIgPCAoICRQYXJhbXtQYWdlU2hvd259ICsgJFBhcmFte1N0YXJ0SGl0fSApICkgewogICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNTaG93biwgJFRpY2tldElEOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPl9TaG93KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXJPblNpdGUsCiAgICAgICAgICAgICAgICBCdWxrICAgICA9PiAkQnVsa0ZlYXR1cmUsCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvdW50ZXJPblNpdGUrKzsKICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gJE91dHB1dCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkeyRPdXRwdXR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZvb3RlckJ1bGtJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtTWV0YScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCnN1YiBfU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG1vdmUgcXVldWVzCiAgICBteSAlTW92ZVF1ZXVlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TW92ZUxpc3QoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QWN0aW9ufSwKICAgICAgICBUeXBlICAgICA9PiAnbW92ZV9pbnRvJywKICAgICk7CgogICAgIyBnZXQgbGFzdCBhcnRpY2xlCiAgICBteSAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUxhc3RDdXN0b21lckFydGljbGUoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRBcnRpY2xle0NyaXRpY2FsaXR5fSA9ICctJzsKICAgIGlmICgkQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDEzfSkgewogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTN9fTsKICAgIH0KICAgICMgbG9va3VwIGltcGFjdAogICAgJEFydGljbGV7SW1wYWN0fSA9ICctJzsKICAgIGlmICgkQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDE0fSkgewogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7SW1wYWN0fSA9ICRJbXBhY3RMaXN0LT57JEFydGljbGV7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQoKICAgICMgcnVuIGFydGljbGUgbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjayggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpbHRlciBvcHRpb24KICAgICAgICAgICAgJE9iamVjdC0+RmlsdGVyKCBBcnRpY2xlID0+IFwlQXJ0aWNsZSwgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiByZXNwb25zZXMgLi4uCiAgICBteSAlU3RkUmVzcG9uc2VzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFN0ZFJlc3BvbnNlcyggUXVldWVJRCA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSApOwogICAgJFBhcmFte1N0ZFJlc3BvbnNlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRTdGRSZXNwb25zZVN0cmluZygKICAgICAgICBTdGRSZXNwb25zZXNSZWYgPT4gXCVTdGRSZXNwb25zZXMsCiAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99CiAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1F1ZXVlJykKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0N1c3RvbWVyTmFtZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgaGVhZGVyIGxpbmVzCiAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZXskX307CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkXywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZm9yICggMSAuLiAzICkgewogICAgICAgIG5leHQgaWYgISRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJEFydGljbGV7IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRBcnRpY2xle0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAlQXJ0aWNsZSwKICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICApOwogICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAkQXJ0aWNsZXtCb2R5Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICRBcnRpY2xle0JvZHl9ICAgICA9ICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgIFRleHQgICAgICAgICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0UHJlVmlld0xpbmVzJykgfHwgMjUsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgICA9PiAxLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSAgPT4gMSwKICAgICAgICAgICAgU3RyaXBFbXB0eUxpbmVzID0+ICRTZWxmLT57Q29uZmlnfS0+e1N0cmlwRW1wdHlMaW5lc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgbXkgJENoYXJzZXRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja0NoYXJzZXQoCiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgKTsKICAgICAgICBpZiAoJENoYXJzZXRUZXh0KSB7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHlOb3RlfSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWNsIGFjdGlvbnMKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgcnVuIHRpY2tldCBwcmUgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICBBQ0wgICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyB0byAxNgogICAgICAgIGlmICggJENvdW50ID49IDEzICYmICRDb3VudCA8PSAxNiApIHsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiMgLS0tCiAgICAgICAgaWYgKCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgLiAnOjpMaW5rJyApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dFBsYWluJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRQbGFpbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dExpbmsnIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dExpbmsnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGltZSAzIHRvIDYKICAgICAgICBpZiAoICRDb3VudCA+PSAzICYmICRDb3VudCA8PSA2ICkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCggJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9ICkKICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkKCAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnRmlyc3RSZXNwb25zZVRpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCggJEFydGljbGV7VXBkYXRlVGltZX0gKSApIHsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xleydVcGRhdGVUaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J1VwZGF0ZVRpbWVXb3JraW5nVGltZSd9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RhcnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCggJEFydGljbGV7U29sdXRpb25UaW1lfSApICkgewogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnU29sdXRpb25UaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnU29sdXRpb25UaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vdmVRdWV1ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRNb3ZlfQogICAgICAgICYmICggIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdtb3ZlJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICApOwogICAgcmV0dXJuIFwkT3V0cHV0Owp9CjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld1ByZXZpZXcucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpY2tldE92ZXJ2aWV3UHJldmlldy5wbSx2IDEuMiAyMDEwLzAyLzExIDIyOjE3OjM2IHViIEV4cCAkCiMgJE9sZElkOiBUaWNrZXRPdmVydmlld1ByZXZpZXcucG0sdiAxLjE0LjIuMSAyMDEwLzAyLzAxIDAwOjU3OjM4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0T3ZlcnZpZXdQcmV2aWV3OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gXCVQYXJhbTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQgVXNlck9iamVjdCBHcm91cE9iamVjdCBUaWNrZXRPYmplY3QgTWFpbk9iamVjdCBRdWV1ZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRpY2tldElEcyBQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVGlja2V0SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwogICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3TWV0YScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwogICAgbXkgJE91dHB1dFJhdyA9ICcnOwogICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0TWV0YSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TWV0YTsKICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgID0gJyc7CiAgICBteSAkQ291bnRlciAgICAgICA9IDA7CiAgICBteSAkQ291bnRlck9uU2l0ZSA9IDA7CiAgICBteSBAVGlja2V0SURzU2hvd247CiAgICBmb3IgbXkgJFRpY2tldElEICggQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKICAgICAgICAkQ291bnRlcisrOwogICAgICAgIGlmICggJENvdW50ZXIgPj0gJFBhcmFte1N0YXJ0SGl0fSAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldElEc1Nob3duLCAkVGlja2V0SUQ7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnRlck9uU2l0ZSwKICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRQYXJhbXtDb25maWd9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiAkT3V0cHV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0UmF3IC49ICR7JE91dHB1dH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0Rm9vdGVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEc1Nob3duKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGb290ZXJCdWxrSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRPdXRwdXRNZXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXdNZXRhJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0TWV0YSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TWV0YTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRQYXJhbXtCdWxrfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCdWxrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGdldCBsYXN0IGFydGljbGUKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlTGFzdEN1c3RvbWVyQXJ0aWNsZSgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJEFydGljbGV7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTN9KSB7CiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JEFydGljbGV7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCgogICAgIyBydW4gYXJ0aWNsZSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlYnVnICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSBARGF0YSA9ICRPYmplY3QtPkNoZWNrKCBBcnRpY2xlID0+IFwlQXJ0aWNsZSwgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgIGZvciBteSAkRGF0YVJlZiAoQERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmlsdGVyIG9wdGlvbgogICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcyAuLi4KICAgIG15ICVTdGRSZXNwb25zZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3RkUmVzcG9uc2VzKCBRdWV1ZUlEID0+ICRBcnRpY2xle1F1ZXVlSUR9ICk7CiAgICAkUGFyYW17U3RkUmVzcG9uc2VzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldFN0ZFJlc3BvbnNlU3RyaW5nKAogICAgICAgIFN0ZFJlc3BvbnNlc1JlZiA9PiBcJVN0ZFJlc3BvbnNlcywKICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIG15ICVDdXN0b21lckRhdGEgPSAoKTsKICAgIGlmICgKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e0N1c3RvbWVySW5mb30KICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvUXVldWUnKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQXJ0aWNsZXtDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBoZWFkZXIgbGluZXMKICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgIG5leHQgaWYgISRBcnRpY2xleyRffTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7JF99LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgbmV4dCBpZiAhJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBodW1hbiBhZ2UKICAgICRBcnRpY2xle0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJEFydGljbGV7QWdlfSwgU3BhY2UgPT4gJyAnICk7CgogICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKAogICAgICAgICVBcnRpY2xlLAogICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICk7CiAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICRBcnRpY2xle0JvZHlOb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgJEFydGljbGV7Qm9keX0gICAgID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRQcmVWaWV3TGluZXMnKSB8fCAyNSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDEsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAxLAogICAgICAgICAgICBTdHJpcEVtcHR5TGluZXMgPT4gJFNlbGYtPntDb25maWd9LT57U3RyaXBFbXB0eUxpbmVzfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIGNoYXJzZXQgY2hlY2sKICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICApOwogICAgICAgIGlmICgkQ2hhcnNldFRleHQpIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keU5vdGV9ID0gJENoYXJzZXRUZXh0OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY2wgYWN0aW9ucwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAnLScsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBydW4gdGlja2V0IHByZSBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgIEFDTCAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIHRvIDE2CiAgICAgICAgaWYgKCAkQ291bnQgPj0gMTMgJiYgJENvdW50IDw9IDE2ICkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCAuICc6OkxpbmsnICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dFBsYWluJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0TGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgLiAnOjpMaW5rJyApLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0aW1lIDMgdG8gNgogICAgICAgIGlmICggJENvdW50ID49IDMgJiYgJENvdW50IDw9IDYgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJEFydGljbGV7ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99CiAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1F1ZXVlJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhICAgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICAgICAgICAgIFR5cGUgICA9PiAnTGl0ZScsCiAgICAgICAgICAgIE1heCAgICA9PiAkUGFyYW17Q29uZmlnfS0+e0N1c3RvbWVySW5mb01heFNpemV9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvUXVldWVNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCggJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9ICkKICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkKCAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnRmlyc3RSZXNwb25zZVRpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCggJEFydGljbGV7VXBkYXRlVGltZX0gKSApIHsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xleydVcGRhdGVUaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J1VwZGF0ZVRpbWVXb3JraW5nVGltZSd9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RhcnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCggJEFydGljbGV7U29sdXRpb25UaW1lfSApICkgewogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnU29sdXRpb25UaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnU29sdXRpb25UaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vdmVRdWV1ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRNb3ZlfQogICAgICAgICYmICggIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdtb3ZlJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIHJldHVybiBcJE91dHB1dDsKfQoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlLnBtLHYgMS41IDIwMTAvMDIvMjIgMTA6MDc6NDAgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlF1ZXVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUeXBlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KERCT2JqZWN0IEVuY29kZU9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntRdWV1ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UXVldWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQcmlvcml0eU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyfSAgID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U0xBLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1R5cGVPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntQcmlvcml0eU9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRpbWVTdGFtcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIG15ICgkRGF0ZSkgPSBzcGxpdCAvXHMrLywgJFRpbWVTdGFtcDsKICAgIG15ICRUb2RheSA9IHNwcmludGYgIiVzIDIzOjU5OjU5IiwgJERhdGU7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnU2VydmljZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTTEEnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnU0xBSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgdHlwZSBsaXN0CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZTEgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUeXBlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGUxOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpDdXN0b21lcklEQXNNdWx0aVNlbGVjdCcpICkgewoKICAgICAgICAjIEdldCBDdXN0b21lcklECiAgICAgICAgIyAoVGhpcyB3YXkgYWxzbyBjYW4gYmUgdGhlIHNvbHV0aW9uIGZvciB0aGUgQ3VzdG9tZXJVc2VySUQpCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0JywKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRHsgJFJvd1swXSB9ID0gJFJvd1swXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUN1c3RvbWVySUQsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KCiAgICBGUkVFS0VZOgogICAgZm9yIG15ICRGcmVlS2V5ICggMSAuLiAxNiApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGZyZWUga2V5IGNvbmZpZwogICAgICAgIG15ICRUaWNrZXRGcmVlS2V5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5ICk7CgogICAgICAgIG5leHQgRlJFRUtFWSBpZiByZWYgJFRpY2tldEZyZWVLZXkgbmUgJ0hBU0gnOwoKICAgICAgICBteSBARnJlZUtleSA9IGtleXMgJXskVGlja2V0RnJlZUtleX07CiAgICAgICAgbXkgJE5hbWUgICAgPSAnJzsKCiAgICAgICAgaWYgKCBzY2FsYXIgQEZyZWVLZXkgPT0gMSApIHsKICAgICAgICAgICAgJE5hbWUgPSAkVGlja2V0RnJlZUtleS0+eyAkRnJlZUtleVswXSB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE5hbWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXk7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJFRpY2tldEZyZWVLZXksCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBteSAkVGlja2V0RnJlZVRleHQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICBUeXBlICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFRpY2tldEZyZWVUZXh0KSB7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+ICRUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhIGxpc3QKICAgICAgICBteSAkQXJ0aWNsZURhdGFMaXN0ID0gJFNlbGYtPl9BcnRpY2xlRGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkQXJ0aWNsZURhdGFMaXN0OwoKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICFAeyRBcnRpY2xlRGF0YUxpc3R9OwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgQHskQXJ0aWNsZURhdGFMaXN0fSA+IDI7CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhIHBob25lIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVEYXRhTGlzdC0+WzFdICkgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhbiBleHRlcm5hbCBlbWFpbCBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlVHlwZUlEfSBlcSAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpbGNlIGNvbWVzIGZyb20gYW4gYWdlbnQgKEVtYWlsLVRpY2tldCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QWdlbnRTZW5kZXJUeXBlSUR9IGVxICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICAmJiAhJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzKys7CiAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpcnN0IGFydGljbGUgY29tZXMgZnJvbSBjdXN0b21lciBhbmQgdGhlIHNlY29uZCBvbmUgZnJvbSBhbiBhZ2VudAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBZ2VudFNlbmRlclR5cGVJRH0gZXEgJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmICRBcnRpY2xlRGF0YUxpc3QtPlsxXQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdLT57QWdlbnRTZW5kZXJUeXBlSUR9IGVxICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzKys7CiAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVElEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0czsKfQoKc3ViIF9BcnRpY2xlRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHR5cGUgJ3Bob25lJwogICAgaWYgKCAhJFNlbGYtPntQaG9uZVR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntQaG9uZVR5cGVJRH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTG9va3VwKAogICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAncGhvbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSB0eXBlICdlbWFpbC1leHRlcm5hbCcKICAgIGlmICggISRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntFbWFpbEV4dGVybmFsVHlwZUlEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMb29rdXAoCiAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICdlbWFpbC1leHRlcm5hbCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHNlbmRlciB0eXBlICdhZ2VudCcKICAgIGlmICggISRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSBzZW5kZXIgdHlwZSAnY3VzdG9tZXInCiAgICBpZiAoICEkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICApOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBhcnRpY2xlX3R5cGVfaWQsIGFydGljbGVfc2VuZGVyX3R5cGVfaWQgRlJPTSBhcnRpY2xlICcKICAgICAgICAgICAgLiAnV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgYXJ0aWNsZV90eXBlX2lkIElOICggPywgPyApIEFORCAnCiAgICAgICAgICAgIC4gJ2FydGljbGVfc2VuZGVyX3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBcJFNlbGYtPntQaG9uZVR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9LAogICAgICAgICAgICBcJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDMsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEFydGljbGVEYXRhTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICVBcnRpY2xlRGF0YTsKICAgICAgICAkQXJ0aWNsZURhdGF7QXJ0aWNsZVR5cGVJRH0gICAgICAgPSAkUm93WzBdOwogICAgICAgICRBcnRpY2xlRGF0YXtBcnRpY2xlU2VuZGVyVHlwZUlEfSA9ICRSb3dbMV07CgogICAgICAgIHB1c2ggQEFydGljbGVEYXRhTGlzdCwgXCVBcnRpY2xlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXEBBcnRpY2xlRGF0YUxpc3Q7Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIHNvbHV0aW9uIHRpbWUgYXZlcmFnZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UucG0sdiAxLjYgMjAxMC8wNy8xNSAwOTo0NToyMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBFbmNvZGVPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IFRpbWVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UXVldWVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlF1ZXVlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UHJpb3JpdHlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlcn0gICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJ0lUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGxpc3QKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgIFN0YXRlVHlwZSA9PiBbJ2Nsb3NlZCddLAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgIG15ICVRdWV1ZUxpc3QgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0QWxsUXVldWVzKCk7CgogICAgIyBnZXQgcHJpb3JpdHkgbGlzdAogICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57UHJpb3JpdHlPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzM4MzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDcmVhdGVkIGluIFF1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnQ3JlYXRlZFF1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0JvZHknLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywgICAgIyAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBUaW1lU3RvcCAgICAgICAgID0+ICRUb2RheSwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ1RpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICAgICAgVGltZVN0b3AgID0+ICdUaWNrZXRDcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IHR5cGUgbGlzdAogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUxID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVHlwZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlMTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6VXNlQWdlbnRFbGVtZW50SW5TdGF0cycpICkgewoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdBZ2VudC9Pd25lcicsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdPd25lcklEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBieSBBZ2VudC9Pd25lcicsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDcmVhdGVkVXNlcklEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnUmVzcG9uc2libGVJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBjdXN0b21lcl9pZCBGUk9NIHRpY2tldCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJUN1c3RvbWVySUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUR7ICRSb3dbMF0gfSA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDdXN0b21lcklELAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CgogICAgRlJFRUtFWToKICAgIGZvciBteSAkRnJlZUtleSAoIDEgLi4gMTYgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBmcmVlIGtleSBjb25maWcKICAgICAgICBteSAkVGlja2V0RnJlZUtleSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSApOwoKICAgICAgICBuZXh0IEZSRUVLRVkgaWYgcmVmICRUaWNrZXRGcmVlS2V5IG5lICdIQVNIJzsKCiAgICAgICAgbXkgQEZyZWVLZXkgPSBrZXlzICV7JFRpY2tldEZyZWVLZXl9OwogICAgICAgIG15ICROYW1lICAgID0gJyc7CgogICAgICAgIGlmICggc2NhbGFyIEBGcmVlS2V5ID09IDEgKSB7CiAgICAgICAgICAgICROYW1lID0gJFRpY2tldEZyZWVLZXktPnsgJEZyZWVLZXlbMF0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICROYW1lID0gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5OwoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+ICRUaWNrZXRGcmVlS2V5LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUZXh0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgVHlwZSAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRUaWNrZXRGcmVlVGV4dCkgewoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LCwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgYWxsIGNsb3NlZCBzdGF0cyBpZiBubyBzdGF0ZXMgYXJlIGdpdmVuCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRHN9ICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGV9ID0gWydjbG9zZWQnXTsKICAgIH0KCiAgICAjIHN0YXJ0IHRpY2tldCBzZWFyY2gKICAgIG15IEBUaWNrZXRTZWFyY2hJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICctJyBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkVGltZSA9IDA7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0U2VhcmNoSURzKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJFRpY2tldERhdGEgPSAkU2VsZi0+X1RpY2tldERhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJXskVGlja2V0RGF0YX07CgogICAgICAgICMgZ2V0IHJlbGV2YW50IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgJEhpc3RvcnlEYXRhID0gJFNlbGYtPl9UaWNrZXRIaXN0b3J5RGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkSGlzdG9yeURhdGE7CgogICAgICAgICMgaWYgdGlja2V0IGlzIGNsb3NlZCBpbiB0aGUgdGlja2V0IGNyZWF0ZSBtYXNrCiAgICAgICAgaWYgKCBAeyRIaXN0b3J5RGF0YX0gPT0gMSApIHsKICAgICAgICAgICAgJFRpbWUgKz0gKCAzICogNjAgKTsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgIG15ICVUaW1lc3BhbnM7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskSGlzdG9yeURhdGF9ICkgewoKICAgICAgICAgICAgaWYgKCAkVGltZXNwYW5zeyRDb3VudGVyfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdG9wIHRpbWUKICAgICAgICAgICAgICAgICRUaW1lc3BhbnN7JENvdW50ZXJ9LT57U3RvcFRpbWV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbnRyeS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0YXJ0VGltZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVudHJ5LT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhcgogICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT5fQ2FsZW5kYXJHZXQoCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gJFRpY2tldERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDb3VudCAoIHNvcnQga2V5cyAlVGltZXNwYW5zICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGltZXNwYW4gPSAkVGltZXNwYW5zeyRDb3VudH07CgogICAgICAgICAgICAkVGltZXNwYW4tPntTdG9wVGltZX0gfHw9ICRUaW1lc3Bhbi0+e1N0YXJ0VGltZX0gKyAoIDMgKiA2MCApOwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgd29ya2luZyB0aW1lCiAgICAgICAgICAgIG15ICRXb3JraW5nVGltZVBhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5Xb3JraW5nVGltZSgKICAgICAgICAgICAgICAgICV7JFRpbWVzcGFufSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRUaW1lICs9ICRXb3JraW5nVGltZVBhcnQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRDb3VudCA9IEBUaWNrZXRTZWFyY2hJRHM7CiAgICBteSAkQXZlcmFnZVRpbWUgPSAkVGltZSAvICRUaWNrZXRDb3VudDsKCiAgICAjIHRyYW5zbGF0ZSBzZWNvbmRzIGluIGEgcmVhZGFibGUgZm9ybWF0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+X1NlY29uZGVUb1N0cmluZygKICAgICAgICBTZWNvbmRzID0+IGludCAkQXZlcmFnZVRpbWUsCiAgICApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCnN1YiBfVGlja2V0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB7fSBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgcXVldWVfaWQsIHNsYV9pZCwgY3JlYXRlX3RpbWVfdW5peCAnCiAgICAgICAgICAgIC4gJ0ZST00gdGlja2V0IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RpY2tldElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRpY2tldERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUaWNrZXREYXRhe1F1ZXVlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkVGlja2V0RGF0YXtTTEFJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRpY2tldERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJVRpY2tldERhdGE7Cn0KCnN1YiBfQ2FsZW5kYXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb3B0aW9uCiAgICAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpOwoKICAgIG15ICVFc2NhbGF0aW9uRGF0YTsKICAgIGlmICggJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gJiYgJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9ICkgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1F1ZXVlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEVzY2FsYXRpb25EYXRhe0NhbGVuZGFyfSB8fCB1bmRlZjsKfQoKc3ViIF9UaWNrZXRIaXN0b3J5RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBTdGF0ZVVwZGF0ZQogICAgaWYgKCAhJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnU3RhdGVVcGRhdGUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgaGlzdG95IHR5cGUgTmV3VGlja2V0CiAgICBpZiAoICEkU2VsZi0+e05ld1RpY2tldElEfSApIHsKICAgICAgICAkU2VsZi0+e05ld1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2aWV3YWJsZSBzdGF0ZSBpZHMKICAgIGlmICggISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlU3RhdGVJRHMgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVmlld2FibGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICAgICApOwoKICAgICAgICBteSAlVmlld2FibGVTdGF0ZUlETGlzdDsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBWaWV3YWJsZVN0YXRlSURzKSB7CiAgICAgICAgICAgICRWaWV3YWJsZVN0YXRlSURMaXN0eyRTdGF0ZUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9ID0gXCVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBzdGF0ZV9pZCwgY3JlYXRlX3RpbWUgRlJPTSB0aWNrZXRfaGlzdG9yeSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHRpY2tldF9pZCA9ID8gQU5EIGhpc3RvcnlfdHlwZV9pZCBJTiAoID8sID8gKSAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNyZWF0ZV90aW1lJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0sIFwkU2VsZi0+e1N0YXRlVXBkYXRlSUR9LCBcJFNlbGYtPntOZXdUaWNrZXRJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVGlja2V0SGlzdG9yeUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlSGlzdG9yeURhdGE7CiAgICAgICAgJEhpc3RvcnlEYXRhe1N0YXRlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkSGlzdG9yeURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzFdOwoKICAgICAgICBwdXNoIEBUaWNrZXRIaXN0b3J5TGlzdCwgXCVIaXN0b3J5RGF0YTsKICAgIH0KCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKEBUaWNrZXRIaXN0b3J5TGlzdCkgewoKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAwOwogICAgICAgIG5leHQgRU5UUlkgaWYgISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30tPnsgJEVudHJ5LT57U3RhdGVJRH0gfTsKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAxOwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEhpc3RvcnlMaXN0Owp9CgpzdWIgX1NlY29uZGVUb1N0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkUGFyYW17U2Vjb25kc307CgogICAgIyBjYWxjdWxhdGUgdGhlIHNlY29uZHMKICAgIG15ICRTZWNvbmRzID0gJFBhcmFte1NlY29uZHN9ICUgNjA7CiAgICAkUGFyYW17U2Vjb25kc30gPSAoICRQYXJhbXtTZWNvbmRzfSAtICRTZWNvbmRzICkgLyA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbWludXRlcwogICAgbXkgJE1pbnV0ZXMgPSAkUGFyYW17U2Vjb25kc30gJSA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgaG91cnMKICAgIG15ICRIb3VycyA9ICggJFBhcmFte1NlY29uZHN9IC0gJE1pbnV0ZXMgKSAvIDYwOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRIb3VycyAgIHx8PSAwOwogICAgJE1pbnV0ZXMgfHw9IDA7CiAgICAkU2Vjb25kcyB8fD0gMDsKCiAgICBpZiAoICRTZWNvbmRzID49IDMwICkgewogICAgICAgICRNaW51dGVzKys7CiAgICB9CgogICAgJE1pbnV0ZXMgPSBzcHJpbnRmICIlMDJkIiwgJE1pbnV0ZXM7CgogICAgbXkgJEhvdXJzU3RyaW5nICAgPSAnSG91cnMnOwogICAgbXkgJE1pbnV0ZXNTdHJpbmcgPSAnTWludXRlcyc7CgogICAgcmV0dXJuICIkSG91cnMgJEhvdXJzU3RyaW5nICRNaW51dGVzICRNaW51dGVzU3RyaW5nIjsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtLHYgMS45IDIwMDkvMDcvMjAgMjI6NDc6MjMgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6Q29uZmlnOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDU1Y7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKICAgIHVzZSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIHN5c2NvbmZpZyBvYmplY3QKICAgICRTZWxmLT57U3lzQ29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWctPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIHJlYnVpbGQgWlpaKiBmaWxlcwogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9LT5Xcml0ZURlZmF1bHQoKTsKCiAgICAjIGRlZmluZSB0aGUgWlpaIGZpbGVzCiAgICBteSBAWlpaRmlsZXMgPSAoCiAgICAgICAgJ1paWkFBdXRvLnBtJywKICAgICAgICAnWlpaQXV0by5wbScsCiAgICApOwoKICAgICMgcmVsb2FkIHRoZSBaWlogZmlsZXMgKG1vZF9wZXJsIHdvcmthcm91bmQpCiAgICBmb3IgbXkgJFpaWkZpbGUgKEBaWlpGaWxlcykgewoKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgIS1mICRGaWxlOwogICAgICAgICAgICBkbyAkRmlsZTsKICAgICAgICAgICAgbGFzdCBQUkVGSVg7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICAkU2VsZi0+e0NTVk9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q1NWLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VHlwZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdHNPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0cy0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlZmluZSBmaWxlIHByZWZpeCBmb3Igc3RhdHMKICAgICRTZWxmLT57RmlsZVByZWZpeH0gPSAnSVRTTVN0YXRzJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBuZXcgdGlja2V0IHN0YXRlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBUeXBlTmFtZXMgPSAoCiAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6U2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OkRpc2FzdGVyJywKICAgICAgICAgICAgJ1Byb2JsZW0nLAogICAgICAgICAgICAnUHJvYmxlbTo6S25vd25FcnJvcicsCiAgICAgICAgICAgICdQcm9ibGVtOjpQZW5kaW5nUmZDJywKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IG5ldyB0aWNrZXQgc3RhdGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFN0YXRlTmFtZXMgPSAoCiAgICAgICAgICAgICdjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJywKICAgICAgICApOwoKICAgICAgICAjIHNldCBzdGF0ZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFR5cGVOYW1lcyA9ICgKICAgICAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAgICAgJ0luY2lkZW50OjpTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6RGlzYXN0ZXInLAogICAgICAgICAgICAnUHJvYmxlbScsCiAgICAgICAgICAgICdQcm9ibGVtOjpLbm93bkVycm9yJywKICAgICAgICAgICAgJ1Byb2JsZW06OlBlbmRpbmdSZkMnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgICAgIFR5cGVOYW1lcyA9PiBcQFR5cGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gaW52YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIGludmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gaW52YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRTdGF0ZVZhbGlkKCkKCnNldHMgc3RhdGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgIFN0YXRlTmFtZXMgPT4gWyAnbmV3JywgJ29wZW4nIF0sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0U3RhdGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVOYW1lc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU3RhdGVOYW1lcyEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHZhbGlkIGlkCiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgJVZhbGlkTGlzdCA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZElEID0gJFBhcmFte1ZhbGlkfSA/ICRWYWxpZExpc3R7dmFsaWR9IDogJFZhbGlkTGlzdHtpbnZhbGlkfTsKCiAgICBTVEFURU5BTUU6CiAgICBmb3IgbXkgJFN0YXRlTmFtZSAoIEB7ICRQYXJhbXtTdGF0ZU5hbWVzfSB9ICkgewoKICAgICAgICAjIGdldCBzdGF0ZQogICAgICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkU3RhdGVOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVEVOQU1FIGlmICElU3RhdGU7CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlVXBkYXRlKAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2V0VHlwZVZhbGlkKCkKCnNldHMgdHlwZXMgdG8gdmFsaWR8aW52YWxpZAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFR5cGVWYWxpZCgKICAgICAgICBUeXBlTmFtZXMgPT4gWyAnSW5jaWRlbnQnLCAnUHJvYmxlbScgXSwKICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1NldFR5cGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZU5hbWVzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBUeXBlTmFtZXMhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgVFlQRU5BTUU6CiAgICBmb3IgbXkgJFR5cGVOYW1lICggQHsgJFBhcmFte1R5cGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICRUeXBlTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRZUEVOQU1FIGlmICEkVHlwZUlEOwoKICAgICAgICAjIGdldCB0eXBlCiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlR2V0KAogICAgICAgICAgICBJRCA9PiAkVHlwZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGUKICAgICAgICAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlVXBkYXRlKAogICAgICAgICAgICAlVHlwZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzA3LzIwIDIyOjQ3OjIzICQKCj1jdXQK
closed with workaround
ticket is closed with workaround
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::ServiceRequest
1
current_timestamp
1
current_timestamp
1
Incident::Disaster
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1
Problem::KnownError
1
current_timestamp
1
current_timestamp
1
Problem::PendingRfC
1
current_timestamp
1
current_timestamp
1