ITSMConfigurationManagement
1.3.71
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.0.1 alpha1.
The OTRS::ITSM Configuration Management package.
Das OTRS::ITSM Configuration Management Paket.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package ITSMConfigurationManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 1.3.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 1.3.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the config item menu, you need to add them as member to the group 'itsm-configitem'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf das ConfigItem-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-configitem' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'itsm-configitem' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
All links to config item objects will be irrevocably deleted!
<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 Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'itsm-configitem' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
Alle Verknüpfungen zu ConfigItem-Objekten werden unwiderruflich gelöscht!
<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 ITSMConfigurationManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 1.3.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMConfigurationManagement zu aktualisieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 1.3.71</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 = 'CodeUpgrade';
# 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."
);
}
}
2009-09-08 19:07:05
opms.otrs.com
iVBORw0KGgoAAAANSUhEUgAABh4AAAQuCAIAAACs0tAIAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAfQAAAH0AG5i+efAAAgAElEQVR4nOzdf2wU953/8c/Ya++CCzZxgiEBuyQppg26uIkvaciJa0FKmt6ltCqK4CQa3YlEvlNyaq6kl1T+I1L2dD0lEdWlp6xCr6eEP6AVUsQ5p96hQiWucLnGpOVKWpyQGBwIxsHBBmzW9nrn+8enme90fu3M7MzOzM7z8Qdaj2c+855ZL555+fP5jKKqqgAAAAAAAAC8y0RdAAAANXXhwoXp6enrr79+0aJFgTc+PT194cKFBQsWLFu2LPDGAQAAgBhqiLoAAABqan5+vlQqlcvl8BovlUphNA4AAADEENESACBd5EhwRVHCaFwmVo2NjWE0DgAAAMQQ0RIAII1Cipbm5+eFEA0N/HoFAABAWnDtCwBIlxr0WiJaAgAAQHpw7QsASJdQoyXZa4kBcQAAAEgPoiUAQLrIaCkk9FoCAABA2nDtCwBIl4ZPhNE403gDAAAgbTJRFwAAQE2tWLEivMbptQQAAIC04doXAIDA8IQ4AAAApA3XvgAABIYBcQAAAEgboiUAAALDgDgAAACkDde+AAAEo1wuy8fPES0BAAAgPbj2BQAgGLLLkqIoREsAAABID659AQAIBnN4AwAAIIUyURcAAECdaGxsvO6666KuAgAAAKgpRc4KAQAAAAAAAHhFryUAQIqoqjo6OqooSkdHh6IoUZcDAAAAJB7zQQAAUqRcLl+9evXKlStRFwIAAADUCXotAQBSpKGh4YYbblBVlS5LAAAAQCCYawkAAAAAAAA+MSAOAAAAAAAAPhEtAQAAAAAAwCeiJQAAAAAAAPhEtAQAQDBKpVK5XI66CgAAAKCmeEIcAADB+OCDD0ql0sqVK3O5XNS1AAAAADVCryUAAIIhH7ra0MDvVgAAAKSIIq+DAQBA9crlMtESAAAAUoVoCQCQIuVyeX5+XlGUTIYh4QAAAEAA+MsqACBFpqenT58+ff78+agLAQAAAOoE0RIAIEVkX11FUaIuBAAAAKgTREsAgNQhWgIAAACCQrQEAEgRei0BAAAAwSJaAgCkCNESAAAAECyiJQBAivBcVAAAACBYREsAgBSh1xIAAAAQrEzUBQAAUGthREuXL18uFouf+tSnFi5cGHjjAAAAQGzRawkAkCLh9Vqanp6enJycmZkJvGUAAAAgzoiWAAApEl60VC6XhRCNjY2BtwwAAADEGdESACBFwpvGW0ZLDQ38YgUAAEC6cAUMAEiR8Hotzc/PC6IlAAAApA9XwACAFAl7QBzREgAAANKGK2AAQIow1xIAAAAQLKIlAEDqBB4tqapKryUAAACkE1fAAIAUCanXksyVBNESAAAA0ocrYABAioQaLTU0NIQx1A4AAACIM6IlAECKyGgpcDweDgAAAKnFRTAAIEVC7bXEHN4AAABIIaIlAEDqhDcgLthmAQAAgPjjIhgAkCJNTU25XC7w7kUMiAMAAEBqZaIuAACA2lm6dGkYzTIgDgAAAKnF31cBAKgWvZYAAACQWlwEAwBQLeZaAgAAQGpxEQwAQLUYEAcAAIDUIloCAKBaDIgDAABAanERDABAtRgQBwAAgNTiIhgAgGoxIA4AAACppaiqGnUNAAAkW7FYLJVKCxYsIF0CAABA2hAtAQAAAAAAwKdM1AUAAFAj8/Pz586dUxRl5cqVUdcCAAAA1AmiJQBAWpTL5ZmZGUVRoi4EAAAAqB8MiAMApIWqqteuXVNVtaWlJepaAAAAgDpBtAQAAAAAAACfGqIuAAAAAAAAAElFtAQAAAAAAACfiJYAAAAAAADgE0+IAwCgKjMzM6VSqbm5uampKepaAAAAgFqj1xIAAFW5cuXKhx9+ODExEXUhAAAAQASIlgAAqEomk8lms3RZAgAAQDopqqpGXQMAAAAAAAASibmWAABpMTs7Ozc319TU1NzcHHUtAAAAQJ1gQBwAIC2YFAkAAAAIHNESACAt5BhwRVGiLgQAAACoH0RLAIC0kNFSQwO/+wAAAIDAcHkNAEiLcrks6LUEAAAABIpoCQCQFgyIAwAAAAJHtAQASAsGxAEAAACB4/IaAJAW9FoCAAAAApeJugAAAGokjLmWisXi2NhYNpvt6OgIsFkAAAAgKYiWAABpEUavpfn5+ZmZGXpCAQAAILUYEAcASIsw5lqan58PvE0AAAAgQbgUBgCkRRgD4mSbREsAAABILS6FAQBpEcaAOBktNTY2BtgmAAAAkCBESwCAtAhpriVBryUAAACkGJfCAIC0CGOuJXotAQAAIOWIlgAAaRHGXEv0WgIAAEDKcSkMAEgF2WVJMI03AAAAECguhQEAqaBFSwyIAwAAAAJEtAQASIWQei0xIA4AAAApx6UwACAVwphoSTAgDgAAAKnHpTAAIBVkr6WQoiUGxAEAACC1MlEXAABALTQ0NCxevDiM0XCCXksAAABIMaIlAEAqZDKZjo6OYNvUBtkF3hkKAAAASAr+ygoAgE+MhgMAAACIlgAA8InHwwEAAABcDQMA4BOPhwMAAAC4GgYAwCcGxAEAAABESwAA+MSAOAAAAICrYQAAfGJAHAAAAKCoqhp1DQAAJJKqqoyJAwAAQMoRLQEAAAAAAMCnTNQFAABQC2NjY5cvX25vb1+yZEnUtQAAAAD1g+khAACpUC6X6agLAAAABI4BcQCAVCiXy/Pz8w0NDcyLBAAAAASIaAkAAAAAAAA+MSAOAAAAAAAAPhEtAQAAAAAAwCeiJQAAAAAAAPhEtAQAgB/z8/MXL16cnJyMuhAAAAAgSpmoCwBC98wzz2j/AkBQ5ubmLl26lMlkWltbo64FAIDkOXDgwPHjx6empoQQuVzuqaeeiroiAD4lJloaHBwcHBycmJgoFotCiFwu19bW1tvb29vbK7ykBnYpQ0tLy9KlSx9++GHzJq+88sr58+flfltaWpYsWdLT0yP3a2dgYODcuXNXrlzR/qNsa2vr6+tzWaS0b9++EydOWFZr5rAOkQoAhKGxsbGtrU1RlKgLAQAkSTUX59q2Fe9QtDUtd5fP50ulkuV3Dxw4MDQ0NDk5KVdobW1duXLl5s2bfdds58CBA0ePHtW+LBaLifh7cHhF+n7LgDhIRrT0yiuvDA8P65cUi8XR0dHXX3/97bfftsyDvJqamhoeHn7uueeefPJJ/fLnnntOxkPaalNTU2fPnnWOlo4dO2auNp/Pf/nLX3beUKPlSgCAeGpqarrhhhuirgIAkDqe7lD27NmzdetW/ZJ9+/bJkMKsUCiMjo7ql0xOTk5OTp46dSrwLkVDQ0NCiGXLlml/gI9haBJJ2uXpLYN7icgukysB0dKePXtkrrRs2bLPfe5z69evF0IcPnz4t7/97ejo6PDw8J49e8w/H25+bvTf3bdv38mTJ6empgqFgva/2w9/+MOpqamWlpbbb7/9vvvuE0IMDAzI1ZxrzuVyXV1dN910k6xW6+o5ODjoJlqSuVJLS0vFHTkcEQBAMz8/Pzk52djYyOA1AEC09PcpdlfvDt/1dIeSy+XOnDljWPjBBx/kcjnZ40nvlVdekbnSqlWrbrvtNnnbsm/fvlOnTplXrp6crFA/sCMR9zJhF+npLQPiIwHTeL/33ntCiLVr1/b19cmkRgixfv36vr6+tWvXaitUafPmzXfddZcQ4uLFi9pC+X/rl770Jfm/thDiwQcffPLJJ5ctW+bc2lNPPbV161at2vvuu+/uu+/WGnR2+PDhkydPtrS0GPpPAQB8K5VK4+Pj4+PjURcCAEBVPN2hLF++vFgsDgwMaEsGBwcnJyeXL19uWHNwcFD+OX/t2rUPP/yw9ufwzZs3P/XUUxVvf3ygG44l928ZECtx77W0Z8+eUqnU2tpqOb538+bNH3zwweTkpLnToA/33Xff0aNH9f/HydfmfkZeZ00SQqxfv/7QoUMVVzt8+PDhw4ez2WywuZL2dw85dlreXMmF+/btu3jxojaJlZyPtru7W/6u0jbUhnPncrnbbrvtwQcfFLox3rlc7tZbbzW/R/rdZTKZ66+/Xp66733ve8ViccOGDVr6Jj4ZP6z/O8Dhw4cPHTqkn9JP/zeZlpaWVatW6XfqcJgGsq+vvv8tgPqmqqoQoqEhAX9QAQDAgac7lNtuu214ePj06dPakl//+tfacv2a7777rhDC7rbL0LjLa/J9+/YNDw/L1drb27VbDGE1r9Azzzxj2VdLf2Ev96Wfjtaue5f5u75vhdwUWf0J0bh/yyrW737XFdup+EaY19Hf/RmK8XFr6dCyy2O0fDcFghP3aEmm8rfeeqvdCrfeeuuxY8fc9AZyKZP5/+dEdjs8cOCA+TPv1eDgoGzQYZ2QciXND3/4w7NnzxoWGmZ0kn/YP3r06MzMjPyQiz8czl0sFo8dOzYzM6N9buXCEydOZLNZbRNhmi6qVCqNjo7K2aza2tpGR0fPnTunfffAgQPy1+S+ffu0/0fGxsaEEG1tbZb1T01NnThx4uLFi4ZfdZaHqSf7+pIrAalSLpcF0RIAIPk83aH09vb+z//8z/j4uDYvx+joaHt7e29v7+uvv65fs+Jtl8blNfnOnTvlkDdJ3mIIITzdWBluKOS+3G/uULbk5lbIa8tVnhD3b5n7+ivuumI7bt4Ih7s//Wo+bi3dtBzIzxuqEfdoSf6EOXT/e/DBB48dO+Z1TiJLe/bsEUJcf/312pLly5cPDw8fPXp0ZGSks7Ozmp/Lt99+W+hSEjOZKwkhqsmVLJNXbeHo6Kh+4LRkmBZKPolvdHT05MmT2od5ZmZm7dq1MvGR/X1OnDiRyWQMC/WbDA4Oyumi1qxZIxcODg7K/yV/+MMfXn/99aOjo/qxhyMjI/LF+fPntYVyBfmOHDhw4OzZs5lM5pZbbpE91OT0WKOjo4bfrJaHqZFhNrkSkDYyWuJpbgCApPN6h/LpT396fHz87bff7u3tlbNBf/rTnzavVvG2S3J/TT41NaVdkw8ODv73f//35OTk0NCQ1iGo4ty48oZCCLFq1SrtwU0DAwOGJya55ONWyE2RQZ0QPZdvWcX63e/auR03b4Tz3d/27du1Nb3eWrpsueIxunk3UY24R0t2HT4tV/NtcHDw3XffHRoaymQy+n09/PDD8if77NmzZ8+ePXr0qL+nbw4ODn7wwQeGxg1kqqofIBa4/v5+80LDsx56e3t7e3ufeeYZfVqn31DLy80L9ZvIXlpf+tKXtEPWWr548eL27dtPnDihz5UvXrzY0tIihNDPhHLlyhUhhPyfVD5CYuXKldrIx82bN8tHBxr+R7Y8TEkG3uRKQArRawkAUB+83qE8+OCDb7/9tvzz7fnz53O5nGV/HJe3Xe6vyfWPxu7t7Z2enj506JCnSQ/lQLBly5bpHwguOxa4b0Tj+1bIWRgnxOVb5r7+irt2bsfNG+F896dv3OutpcuWq/95Q5XiHi2FyhBY5nK5devWGf4/7evrO3DgwPvvvy+Hnsqnbw4PD3vqW/Tzn/+8VCqtXbvW4T9rOa710KFD5imZ3Mer/iLYw4cPDw8Pf/zxx+KTJzU4sOyKaV44MTEhhHj99dfNK8sjlc+/k/08Dx8+XCwWu7u7hRBDQ0PamDj58At50uR/Lrfddpu+KTnk2OV//YcPHz5x4kRrayu5EpBCzLUEAKgbXu9QZEenPXv2jI+Pr1q1qppdu78mN9z4uJx5Vu/SpUtCiM997nM+a3XH062QWUgnxP1b5qZ+N7t2aMfNG1Hx7s+usIq3li5brv7nDVWKe7SUyWTc9EjST5Dkj8MT2bSweXBw8PTp03KGtkKh4DKh2Llz59TU1LJly7z2daqNF198MYw0t+KjMZcsWTI1NXX69One3l45I91nPvMZIcTQ0JBM6A8cOCBX0zdo+C9D/r/j8jGccrzhggULvB4LgDoQRq+lcrlMVgUAiISnOxSZdMjHahtCEK+qvyZ3T0YzoY7qqP5WKKQT4vItC+pWzrkdN29E4O9+DVpGsOIeLbW0tExOTg4MDNh1ApTPZZRjqbySfXzkJEdTU1P6CaQtya53Bw4cOHr0qKFfn51CoTA5OelmBJbDNEnhDQctFArj4+OZTGbZsmUdHR3ZbNbwNIQqObTT0dFx9uxZeRrHxsa03kk///nPZUwuA6aOjo5AKhFC3HLLLWfOnBkdHX3llVf0nTkBpEEYcy2dO3euWCzedNNNCxcuDLBZAADcc3OHos0MLWeDtlyntbXV+bar/oR9K1QNN29ZUPUHeB7CO3VxeFPgLO5/bl22bJkQ4tSpU3YryG/J1fxZv379XXfdJYQ4ceKE7CnjTH7S3PSliv8T7uWvn/Xr12/fvv3BBx8McP58+Sw82VHIkvylNTExMTg4ODU1tWLFCrl8xYoVpVJpYGBA9sbUfrfJBuVQW42b5+5ptm7dum7dukwmMzw8LBNJAOkRRq+l+fl5wdTgAIAYqHiHImcvtZsNWghx3XXXCcfbLqn6a3L35MAUw74CFMitUHgnpOJbFtStXMV23LwRFe/+fAuvZQQr7tHS1q1bM5nM5OTkvn37zN/dt2/f5ORkJpPRZk3z57777pMT/fzyl7/U/9QWCgXzyjJ+qvg/xXPPPRfzXEl88usnjF6m8ll4x48fd1intbW1WCzKaeHkaDjtxblz5+RES4YG5YP2NPJL933W1q9fv2bNGlkY/z0BqRJGtMT8TQCA2vN3hyKfd+bQI0mOurK77dJ2Gsg1uUuywdOnT1dc09+FfSC3QuGdkIpvWVC3chXbcfNGuLn78ye8lhGsBFwQ33LLLUKIEydOFAoF7X+Nw4cPFwoF+RBEGRZUaevWrcuWLSuVSv/7v/+rLRwdHc3n83v27NEy2oGBgbfeektUejDnc889J+dXcsiVnvlE9cX7Jv+b0P9+2rdv3/e+973qW5bTvI2Pj7/44ov6d23Pnj3PPfec/FL+beTs2bPaaDghRG9vb0tLy8WLF0ulkjbRkhDi5ptvFkLI2ezkkj179shJmmQs6NLmzZtlxyj5SD4AKRHSXEuBtwkAgDPfdyjOent75TCCEydOvPLKK1rj8u5gdHRUfhnUNbkbK1euFEKcPHlSG3AwMDCwc+dO/Trt7e1CiOPHj8uCBwcHX3nllXw+76Z9N7dCssOOdrBmtTwhBkHdylVsx80b4ebuz58AW674bqIacZ9rSQixdetW+fjG0dHR0dFRw0zvq1atCmp67L6+PhkJ7dy584knnhCfTCI+NDQ0NDSkn5G+tbXVebIeOdXZ6OiowwxKcXD77bcfPXrUUKfsTFRly+vXrx8bGztx4sT4+LjlY+/EJw8+ELq5uqWlS5fK5fqJlu67776RkZGzZ88ODQ3pq122bJnXzp/bt283vNEA6l4YPYyIlgAAPugvZX3MrOr7DqWi7du3ywk9hoeHh4eH9Y1r/aECvCavaPPmzfI5a8eOHdOec294fNPtt98unzGvf4KYnDeqYvtuboWuv/760dFR7WDN71QtT4hBULdyFdtx80a4ufvzJ8CWK76bqEYyLogffvjhDRs2LFu2TPtPLZfLLVu27M///M+DnY/5ySeflOPvZGrb39+/du3a1tZW7ZPT0tKydu3auskj7rvvvnXr1rW2tsovgz26zZs3G961lpaWFStWbNiwQdu7fLF69Wr9htrzNQ39P7dv37527VqtZ6ms1t94Q8MbDaDuBR4DyQaDbRMAgIpCvUPp6+u7884729vbtcbb29vXrl371FNPaesEeE1e0ZNPPrlixQpZjJxnur+/X7/C+vXr161bJ/suCY+nws2tUF9fnzarr90At1qeEL2gbuXctFPxjRAu7v58C6plN+8mfFPkH3IBAKhjIyMjMzMzN954Y1BXEqVSaXh4WFGUW2+9NZAGAQBARYODg6+//npra2vd/LE/oXgjYJCAAXEAAFQppF5LPB4OAIDwPPfccytWrPjMZz4jJ2YdGBg4efKk+GT2H9QMbwQqIloCANS/kKIlRsMBABCeqakpy1mlgppsFy7xRqAioiUAQP0LfBpvoiUAAMK2YsWKK1euaHNyt7a2rly5kjij9ngjUBFzLQEA6t+7774rhLj55psbGxsDafDq1avnz5/P5XJ0BQcAAEDK8edWAECdC+NpbvRaAgAAACSuiQEAdU6LlgKcdZtoCQAAAJCYawkAUOcaGhpuuOGGYAeABz55EwAAAJBQREsAgDrX0NDQ1tYWbJvz8/OCaAkAAABgQBwAAD4wIA4AAACQuCYGAMAzBsQBAAAAEtfEAAB4Rq8lAAAAQOKaGAAAz4iWAAAAAIlrYgAAPCNaAgAAACSuiQEA8KyxsbGxsZFoCQAAAFDkRKQAAAAAAACAV5moCwAAIFxzc3NCiEwmoyhK1LUAAAAA9Yae/ACAOjc+Pn769OnJycmoCwEAAADqENESAKDOKYrS0NDAvEgAAABAGJhrCQAAAAAAAD7xJ1wAAAAAAAD4RLQEAAAAAAAAn4iWAAAAAAAA4BPREgAAAAAAAHzKRF0AAAAJMz09PTExsWDBgiVLlkRdCwAAABAxoiUAALyZm5ubmppSFCXqQgAAAIDoKaqqRl0DAABJMjs7WywWGxsbW1paoq4FAAAAiBjREgAAAAAAAHxiQBwAoJ5NTU1dvnx54cKFra2tUdcCAAAA1CGeEAcAqGezs7NXr169du1a1IUAAAAA9YloCQBQz+bn54UQjY2NURcCAAAA1CeiJQBAPSuXy0KIhgZ+3wEAAACh4FIbAFDP6LUEAAAAhIpoCQBQz+i1BAAAAISKS20AQD2T0RK9lgAAAICQEC0BAOqZHBAXbK+la9euzczMqKoaYJsAAABAQhEtAQDqWRi9ls6dOzcyMiJDKwAAACDlMlEXAABAiALvtaSqquyvxPxNAIBgzc/P0yUW/jQ2NiqKEnUVSC+iJQBA3ZJdlkSgvZa0NomWAADBWrt27cmTJ6OuAol07NixO+64I+oqkF5ESwCAuiW7LCmKEuDf8XjkHAAgPEeOHCEggFd/9Ed/FHUJSDuiJQBA3QpjoiWiJQBAeJqbm3O5XNRVIGEYCofIcWUMAKhbYTweTkZLXMMBAAAAEtESAKBu0WsJAAAACBtXxgCAuhVeryWiJQBAat1zzz25XC7YqQzDk5Q6gUTjyhgAULfCiIGIlgAAabZx48Y33njj3nvvVVVVVVXhOrvRVotV1uOmmFgVDMQTV8YAgLoley0xIA4AgKAcO3ZMCHHw4MGoCwEQIzwhDgBQt+i1BABAsCYnJw1LZN+lilyuVmPxrApIHK6MAQB1i15LAAAUCoXu7m45O1JPT4+2PJ/Pd3d3y9Fe3d3d+XxeLpdL9N/VttLGhenHiGmv8/l8V1eXoii5XK6np8cwjkz5hPnLQqHQ09MjK2xra3v00UcNW+Xz+ba2NkVRurq65I60LwuFgpuTYHk4hgPZuHGjbFbWv3XrVvMhG86M5XmTJ0EI0dHRoSiKPJxHH31UUZSOjg431QKJw5UxAKBu0WsJAJByhULhW9/61pkzZx577DFVVTdv3rxx40YhRD6fz+fzExMTcsqkiYkJuUTbcNeuXU888YSqqhs2bDh+/LiMY7Q+PtpES/od5fP5ycnJl156qVgstre3W9ZjaEFVVVnh+fPnv//976uq2tHRsWvXLn26JIuZmJjYsmXLyMhIV1eX/sudO3e6OQ+Wh6PX09Nz6NChBx54QFVVWf9rr71mLvjZZ591Pm/79u17+umn5VZ33323EOKXv/ylEOI3v/mNtgSoQyoAAHVqbm5uenq6VCoF2OaHH374zjvvXLp0KcA2AQBQVXXNmjVvvvlmsG3efvvtQogtW7YYlq9evVoI8cgjj8gvH3nkESHE6tWrVVP0I5dks1nttfm7Qgi5I61B85ral4blhg2fffZZIcTSpUv1W7300ksOXzqfAZeHY2jZrgVP5+2ll17S9tXa2mrXfvVWr1597NixMFoGXFJUBpcCAODahx9+ODU11dHRsXjx4qhrAQDUlc9+9rO7d+/u7e0NsM1cLjczM2O+6TMvVxQlm80Wi0U5mMvwLW2J3Xez2ay5Qf2a2peG5ZaV2O3O+UtLLg+nra1NTiPV2dl544033nvvvc8//7x5fU/nTQjR0dExNja2ZcuWvXv3Ll269MKFCw6l+tbd3b1nz5477rgjjMYBN+jPDwCABwyIAwAkyMzMjPvlditXsyOXGyo6vmuoxo4dO5YuXSqEGBkZeeONN1544YV77rnHvJrX8yZHwO3du1cwGg51jStjAAA8IFoCACRINpt1v9xu5VDJnZrH19S4jP7+/gsXLrz00kvf/va35ai3X/3qV3bVulkofeUrX7F8DdQZrowBAPCAaAkAkCDykWryYWfm5dps2fKFXOhPZ2enEEI/obVLa9as0VcSla9+9atCiL6+vueff35oaEjY9EXyet76+vpkZ6jVq1f39fWFUDgQC1wZAwDgAdESACBBtm3bls1mX3vttR07dggh8vl8d3e3tnz//v1ytf3792ez2W3btvne0f333y+E2L17txCiUCh0dHTYrSn7BGlpV19fXzabffXVV/V5TTUhlz8DAwPaCDgZM33hC18wF+zjvC1fvlwIwURIqG9M4w0AgAenTp1SVXXVqlWZTCbqWgAAdSWMabyFEPl8fvfu3e+8844QorW19c477zx48KBh+erVq7dt29bf3y9cz3tt/u7WrVt/+tOfTk5Otra2PvTQQ7t27RI2U253d3fL/coJsAuFQqFQ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pq7rqssBMPC+853vHDt2THUVSLWbb775/e9/v+oqAABDi2gJAPoqn8/v378/m83m83nVtQAYBr/4xS/+93//97bbblNdCFLqP//zP7/3ve8RLQEAeodoCQD6rVgsqi4BwFBZXV39m7/5G9VVIKVardbx48dVVwEAGGastQQAAAAAAICYiJYAAAAAAAAQE9ESAAAy9Xr9woULGxsbqgsBBsyNN95YLBY1TdM0TXUtAACgh4iWAKAn2u32xYsXVVeBBLRara2trZ2dHdWFAIPklltuefrpp2+66SbTNE3TFEKEzJjs04YskxqyywEAwIllvAEgec1m8+zZs41GI5PJzM/Pqy4HXclkMkKIdrutuhBgkPzoRz8SQjzxxBOqCwEAAD1HtAQACWs0Gi+//LJhGLlcbmJiQnU56FY2mxVES0BEW1tbriPW2KWOQp42cIb1ugAAEEyIA4BklcvlU6dOGYah6/rBgwd1XVddEbrFqCWMiPX19dXVVWt1pCNHjtjH19bWVldXrflcq6ura2tr1nHriPNZ+1X2zC/nLDD78dra2srKiqZpxWLxyJEjrpli2lXeL9fX148cOWJVODMzc+edd7petba2NjMzo2naysqK1ZH95fr6uvzyrTPvvvtuIcTdd99tdWHfGd9+7U6ty7EO3nLLLVZT1tW9733v896KGLcUAIA0I1oCgGS02+1z585dunTJNM3JycmDBw/mcowMHQZWtGSvFwMMpfX19Q9/+MMnT5784Ac/aJrme97znltuuUUIsba2tra2trm5aX0LbG5uWkfsFz788MMf+chHTNM8evToM888Y0Uh9jeL9xtnfX19bW1ta2vrwQcfrNVqQVOGXS2YpmlVeO7cuc985jOmae7Zs+fhhx92pktWMZubm7feeuupU6dWVlacX37605+W34HXve51QoinnnpKCPGTn/zEPtKx30cfffTee++1Cj5y5Mi3v/3td7zjHaZpWlf3ta99zdVRvFsKAECaES0BQAKazebp06d3dnY0TVtcXFxeXma51qFhRUuCgUsYauvr6/V6/Y//+I/vv/9+IcR9991nLZN07Nixer3+rne9yzrtXe96V71eP3bsmP3CkydP3nXXXeLqskq/+MUvwnT03ve+1/mq8BW+613vsl54++23CyEee+wx5zn33nuvEOJLX/qSEOLUqVPOL48fPy5v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3333bWxsmI/PnDljNH7nnXeEEEYwdOjQoStXrphtXn75ZSHEyZMnn376aWsba//GY7NNp2HWEgAATthrCQAAADUZK92M3McQCAQqHn/oQx+amZkJhUI1e7C2r6f/zsSsJQAAnLDXEgAAAKqdPHkyGo0ODg4aq9UefPBBIcSf/MmfnDp1ynwshLhy5crm5qYx28iYqWSwthFCDA4OGg/MNtb+jXTJbNNpFF3XZdcAAEDnKpVKv/nNb4QQhw4dUhRFdjkAAABAZ2FBHAAATlRVNRIl1sQBAAAA1YiWAADYgsvlEkRLAAAAQC1ESwAAbIGdvAEAAAA7REsAAGyBnbwBAAAAO2zjDQDAFvL5vBDC7XazjTcAAABQgWgJAAAAAAAATWJBHAAAAAAAAJpEtAQAAAAAAIAmES0BAAAAAACgSURLAAAAAAAAaBLREgAAAAAAAJpEtAQAAAAAAIAmES0BAAAAAACgSURLAABsLZlMrq+vFwoF2YUAAAAAnUWTXQAAAF0gFotls1mPx+N2u2XXAgAAAHQQoiUAALbm9/sHBgZUVZVdCAAAANBZFF3XZdcAAAAAAACArsReSwAAAAAAAGgS0RIAAAAAAACaRLQEAAAAAACAJhEtAQAAAAAAoElESwAAAAAAAGgS0RIAAAAAAACaRLQEAAAAAACAJhEtAQAAAAAAoElESwAA1GVhYeHXv/51JpORXQgAAADQQYiWAACoi67rQohSqSS7EAAAAKCDEC0BAFAXVVUF0RIAAADw/9u5YxyGQSCIotjs/U+M5BRuHGhGNE6k906w9dfAN2kJACLSEgAArKQlAIhUVZOWAADgm7QEAJF7tTTGePsQAAD4IdISAEQ8iAMAgJW0BAARaQkAAFbSEgBEpCUAAFhJSwAQkZYAAGAlLQFA5E5LTV0CAIAHaQkAIsdxnOfZpCUAAHiQlgAgVVVNWgIAgAdpCQBSvlsCAICJtAQAqTstjTHePgQAAH6FtAQAKaslAACYSEsAkJKWAABgIi0BQEpaAgCAibQEAClpCQAAJtISAKSqqklLAADwIC0BQKr33nu/AxMAANBaO67revsGAAAAAP6S1RIAAAAAm6QlAAAAADZJSwAAAABskpYAAAAA2CQtAQAAALDpA6eR6pLbgKc8AAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ29uZmlnSXRlbS54bWwsdiAxLjUgMjAwOS8wOC8yMCAxNDoxMToxNSBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSVRTTUNvbmZpZ0l0ZW0iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNQ29uZmlnSXRlbSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5JVFNNQ29uZmlnSXRlbSBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmZpZyBJdGVtPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNvbmZpZyBJdGVtPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQ5NTwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW0gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBDb25maWcgSXRlbSBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5Db25maWcgSXRlbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbS1BcmVhPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Db25maWcgSXRlbTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPml0c21fY29uZmlnaXRlbS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMyMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtRWRpdCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBFZGl0PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5FZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVByaW50LU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNvbmZpZ2l0ZW08L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q29uZmlnIEl0ZW0gUHJpbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlByaW50PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Db25maWdJdGVtQWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Db25maWdJdGVtQWRkLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+aXRzbS1jb25maWdpdGVtPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db25maWcgSXRlbSBBZGQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkFkZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUFkZDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5Db25maWcgSXRlbTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY29uZmlnaXRlbTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5TZWFyY2g8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ29uZmlnIEl0ZW1zPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TZWFyY2g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnNlYXJjaC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtU2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q29uZmlnIEl0ZW08L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIEVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlNlYXJjaFJlc3VsdDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ29uZmlnSXRlbS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbSZhbXA7Q2xhc3NJRD0kUURhdGF7IkNsYXNzSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj5vbmNsaWNrPSJqYXZhc2NyaXB0Omhpc3RvcnkuYmFjaygpOyByZXR1cm4gZmFsc2U7IjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1WZXJzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHZlcnNpb25zIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgVmVyc2lvbmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudVZlcnNpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5WZXJzaW9uczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgYmFjayBsaW5rIGluIGNvbmZpZyBpdGVtIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1cvxjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+SGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Db25maWdJdGVtRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5JmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7VmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMDAtRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGVkaXQgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBCZWFyYmVpdGVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQmYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNDAwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgcHJpbnQgbGluayBpbiBjb25maWcgaXRlbSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBEcnVja2VuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENvbmZpZ0l0ZW0tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Db25maWdJdGVtOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50JmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7VmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtQYXJhbSI+dGFyZ2V0PSJwcmludCI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM1MDAtTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSBsaW5rIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgVmVya278cGZlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDb25maWdJdGVtLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ29uZmlnSXRlbTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudExpbmtPYmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QmYW1wO1NvdXJjZU9iamVjdD1JVFNNQ29uZmlnSXRlbSZhbXA7U291cmNlS2V5PSRRRGF0YXsiQ29uZmlnSXRlbUlEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM2MDAtRHVwbGljYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgZHVwbGljYXRlIGxpbmsgaW4gY29uZmlnIGl0ZW0gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgRHVwbGl6aWVyZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ29uZmlnSXRlbS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RHVwbGljYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+RHVwbGljYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQmYW1wO0R1cGxpY2F0ZUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0mYW1wO1ZlcnNpb25JRD0kUURhdGF7IlZlcnNpb25JRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNlbGVjdCB0aGUgY29uZmlnIGl0ZW0gbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuICJBdXRvSW5jcmVtZW50IiBpbmNyZW1lbnRzIHRoZSBjb25maWcgaXRlbSBudW1iZXIsIHRoZSBTeXN0ZW1JRCwgdGhlIENvbmZpZ0l0ZW1DbGFzc0lEIGFuZCB0aGUgY291bnRlciBhcmUgdXNlZC4gVGhlIGZvcm1hdCBpcyAiU3lzdGVtSUQgQ29uZmlnSXRlbUNsYXNzSUQgQ291bnRlciIsIGUuZy4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXVzd2FobCBkZXMgTW9kdWxzIHp1ciBHZW5lcmllcnVuZyBkZXIgQ29uZmlnSXRlbS1OdW1tZXIuICJBdXRvSW5jcmVtZW50IiB65GhsdCBkaWUgQ29uZmlnSXRlbS1OdW1tZXIgYXV0b21hdGlzY2ggaG9jaCB1bmQgdmVyYmluZGV0IHNpZSBtaXQgZGVyIFN5c3RlbUlEIHVuZCBtaXQgZGVyIENvbmZpZ0l0ZW1DbGFzc0lELiBFcyB3aXJkIGRhcyBGb3JtYXQgIlN5c3RlbUlEIENvbmZpZ0l0ZW1DbGFzc0lEIENvdW50ZXIiIHZlcndlbmRldCwgei4gQi4gMTIwNTAwMDAwNCwgMTIwNTAwMDAwNS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25maWdJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBMb2NhdGlvbj0iS2VybmVsL1N5c3RlbS9JVFNNQ29uZmlnSXRlbS9OdW1iZXIvKi5wbSIgU2VsZWN0ZWRJRD0iS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQiPjwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OkRlZmF1bHRTdWJPYmplY3QjIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBkZWZhdWx0IHN1Ym9iamVjdCBvZiB0aGUgY2xhc3MgJ0lUU01Db25maWdJdGVtJy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRhcyBTdGFuZGFyZC1TdWJvYmplY3QgZGVyIEtsYXNzZSAnSVRTTUNvbmZpZ0l0ZW0nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6TGlua09iamVjdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Q29tcHV0ZXI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGRlY2lkZSBpZiB0aGUgc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCBpdHNtIGNvbmZpZyBpdGVtIHN0dWZmLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBTaWUgZmVzdGxlZ2VuLCBvYiBkYXMgU3RhdGlzdGlrLU1vZHVsIGF1Y2ggU3RhdGlzdGlrZW4g/GJlciBJVFNNIENvbmZpZ0l0ZW0gRGluZ2UgZ2VuZXJpZXJlbiBkYXJmLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbiMjI0lUU01Db25maWdJdGVtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+T2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk9iamVrdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+T2JqZWN0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkNvbmZpZyBJdGVtPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmZpZ0l0ZW06OkV2ZW50TW9kdWxlUG9zdCMjIzEwMC1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkV2ZW50LU1vZHVsIGb8ciBDb25maWdJdGVtcywgZGFzIGRhcyBMb2dnaW5nIGluIGRpZSBIaXN0b3JpZSBlcmxhdWJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBoaXN0b3J5IG9yZGVyIHJldmVyc2UgaW4gdGhlIGFnZW50IGludGVyZmFjZSB1bmRlciBjb25maWcgaXRlbSBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlnZSBkaWUgSGlzdG9yaWUgbm9ybWFsIG9kZXIgcvxja3fkcnRzIHNvcnRpZXJ0IGltIEFnZW50LUludGVyZmFjZSB1bnRlciBkZXIgQ29uZmlnSXRlbS1IaXN0b3JpZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNvbmZpZ0l0ZW06OlZpZXdIaXN0b3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJub3JtYWwiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJyZXZlcnNlIj5yZXZlcnNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3JtYWwiPm5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnktT2JqZWt0cyBpbSBBZ2VudGVuLUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jb25maWdpdGVtPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbmZpZyBJdGVtIEhpc3Rvcnk8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkhpc3Rvcnk8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0lUU01Db25maWdJdGVtLnBtLHYgMS41IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDt4CDq7u306OPz8OD26O7t7ejy5SDl5Ojt6PboIENJJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICfP8O7s/+3gIO3gIOTl9Ojt6Pbo//LgJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICfK6+DxJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICfP7urg5uggwuXw8ejo8uUnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ9Hq8OjpIMLl8PHo6PLlJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfP7vHr5eTt7iDv8O7s5e3l7SDu8ic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnz+7x6+Xk7eAg7/Du7P/t4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnz/Du7P/t4PLgIO3gIOTl9Ojt6Pbo6PLlIOUg7eXz8e/l+O3gISDC6OYg8ejx8uXs7ej/IObz8O3g6yDn4CDk5fLg6evoLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSAgICAgICAgPSAnxOAg8vrw8egg6CDiIO/w5eTo+O3o8uUg4uXw8ejoPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7q4Ofg7egg6u7t9Ojj8/Au5eTo7ej26Cc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICAgICAgICAgPSAnxO7x8vrv7egg6u7t9Ojj8/Au5eTo7ej26Cc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICcnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u8evl5O3gIO/w7uz/7eAnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83g7/Dg4ugg6u7v6OUnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn8uXq6+gnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83l4Ory6OLt6Cc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7k5PD65urgJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP6Ovu8i3i7uTg9yc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz+vg7ejw4O0nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7uTz6vLo4uXtJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ5ezu7fIvwvrn8fLg7e7i/+Lg7eUnOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jn6//n+usg7vIg8+/u8vDl4eAnOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w5ePr5ebk4O0nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Ll8fIvyuD35fHy4uXtIOru7fLw7usnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN4PHy7uvl7Sc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Dl7e7x6OwnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Ll6+X07u0nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9H68OL68Cc7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwPD16OLo8OD57iDzLeLuJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB6Ozl8Cc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuDs5fDgJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE7uro7eMg8fLg7fbo/yc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuvg4ujg8vPw4Cc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7k5ewnOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu7ejy7vAnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zo+OrgJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUENNQ0lBIOrg8PLgJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP8Ojt8uXwJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfQ8/Ll8Cc7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0erl7eXwJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfTLeLuIOfgIPHo4/Pw7e7x8ic7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyu7t9uXt8vDg8u7wJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVU0Ig0/Hy8O7p8fLi7ic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiDy7vfq4CDn4CDk7vHy+u8nOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Dk7Ojt6PHy8ODy6OLt5e0g6O3x8vDz7OXt8ic7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz+7y8OXh6PLl6/Hq6CDv8Ojr7ubl7ej/JzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP7vLw5eHo8uXr8ergIM7v5fAu8S3s4Cc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwuPw4OTl7eAnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hw5eTt7iDt6OLuJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj6Cc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAn0frw4vrw7e4g7/Do6+7m5e3o5Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn8frw4vrw7eAgzu/l8C7xLezgJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6ugg6O3x8vDz7OXt8ic7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnyu7t6vPw5e3y7egg7+7y8OXh6PLl6+gnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tl7O4nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5yDn4CDw4Ofw4OHu8vfo9ugnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Xt8vrw7/Dg6fEg6+j25e3nJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB5efv6+Dy7e4g8ODn7/Du8fLw4O3/4uDtJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR7vTy8+XwIPEg7vLi7vDl7SDq7uQnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+jw4O3lIO3gIPLu9+rgJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo8ODt5SDn4CDv8O725fHu8Cc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAny+j25e3n6PDg7eUg5+Ag8frw4vrwJzsKICAgICRMYW5nLT57J1BlciBVc2VyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo8ODt5SDn4CDv7vLw5eHo8uXrJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfF5Ojt6Pfl7SDr6Pbl7ecnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5ywg7uPw4O3o9+XtIO/uIOLw5ezlJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN5e7j8ODt6Pfl7SDr6Pbl7ecnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hv5fbo4Ovt6CDu4eXs7egg7/Du4/Dg7OgnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu5OXrJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR5fDo5e0gze7s5fAnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87v5fDg9uju7e3gIPHo8fLl7OAnOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7vbl8e7wJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP4Ozl8ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0uL68OQg5Ojx6ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAn0uL68OQg5Ojx6jo66uDv4Pbo8uXyJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK4O/g9ujy5fInOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zw5ebu4iDg5ODv8uXwJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICfM8OXm7uIg4OTg7/Ll8Do6SVAg7vIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgICAgPSAnzPDl5u7iIODk4O/y5fA6OklQIMDk8OXxJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCDu8iBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCDg5PDl8Sc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw/Dg9Oj37eAg6uDw8uAnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+PuIO7h7vDz5OLg7eUnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgID0gJ8Tg8uAg7eAg6Ofy6Pfg7eUg7eAg4+Dw4O326P/y4Cc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxODy4CDt4CDo7fHy4Ovg9uj/JzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM8OXm7uIg4OTw5fEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICAgID0gJ8zw5ebu4iDg5PDl8To6zODx6uAg7eAg7+7k7PDl5uDy4Cc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgICAgPSAnzPDl5u7iIODk8OXxOjrD5enyIO/w5fXu5Cc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzODx6uAg7eAg7+7k7PDl5uDy4Cc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnw+Xp8iDv8OX17uQnOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Lo7yDt4CDr6Pbl7efgJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73JzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73OjrK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICA9ICfL6Pbl7efl7SDq6/73OjrE4PLgIO3gIOjn8uj34O3lJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE4PLgIO3gIOjn8uj34O3lJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfM5eTo/yc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjQgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0VsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICfAcmVhLUVsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZFwnZWxlbWVudHMgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdDYW52aWFyIGRlZmluaWNp8yc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdNb3N0cmFyIHZlcnNpb25zJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdPY3VsdGFyIHZlcnNpb25zJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICfabHRpbSBjYW52aSBwZXInOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ9psdGltIGNhbnZpJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICdDYW52aSBkZSBkZWZpbmljafMgaGEgZmFsbGF0ISBWZXVyZSBlbCByZWdpc3RyZSBkZWwgc2lzdGVtYSBwZXIgYSBt6XMgZGV0YWxscy4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQ2VyY2FyIHRhbWLpIGVuIHZlcnNpb25zIGFudGVyaW9ycz8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudHMgZGUgY29uZmlndXJhY2nzIG1vc3RyYXRzJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0VsZW1lbnRzIGRlIGNvbmZpZ3VyYWNp8yBkaXNwb25pYmxlcyc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICdDZXJjYXIgZWxlbWVudHMgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0VzdGF0IGRlbCBkZXNwbGVnYW1lbnQnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnRXN0YXQgYWN0dWFsIGRlbCBkZXNwbGVnYW1lbnQnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnRXN0YXQgZGUgbFwnaW5jaWRlbnQnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgPSAnRXN0YXQgYWN0dWFsIGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0VsIG5vbSBkXCdhcXVlc3QgZWxlbWVudCBkZSBjb25maWd1cmFjafMnOwogICAgJExhbmctPnsnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9CiAgICAgICAgPSAnTFwnZXN0YXQgZGVsIGRlc3BsZWdhbWVudCBkXGFxdWVzdCBlbGVtZW50IGRlIGNvbmZpZ3VyYWNp8yc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9CiAgICAgICAgPSAnTFwnZXN0YXQgZGUgbFwnaW5jaWRlbnQgZFwnYXF1ZXN0IGVsZW1lbnQgZGUgY29uZmlndXJhY2nzJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgPSAn2mx0aW0gY2FudmknOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaWNhcic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGlyYXQnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmFjdGl1JzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgPSAnTWFudGVuaW1lbnQnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BsYW5pZmljYXQnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWNjafMnOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXBhcmFyJzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmV0aXJhdCc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JldmlzYXInOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm92YXIvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpdSc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50JzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnT3JkaW5hZG9yJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9ydOB0aWwnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRyZXMnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWzoZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Vydmlkb3InOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IGRlIGPycGllcyBkZSBzZWd1cmV0YXQnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9qZWN0b3InOwogICAgJExhbmctPnsnQ2FtZXJhJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdD4G1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICA9ICdVbml0YXQgZFwnZXhwYW5zafMnOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWNsYXQnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN8mRlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSYXRvbO0nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRyZXMnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICA9ICdUYXJnZXRhIFBDTUNJQSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0ltcHJlc3NvcmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdFbmNhbWluYWRvcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0VzY+BuZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IGRlIHNlZ3VyZXRhdCc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NvbW11dGFkb3InOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl1IFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgID0gJ1B1bnQgZFwnYWNj6XMgV0xBTic7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJlcyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgID0gJ0VpbmEgZFwnYWRtaW5pc3RyYWNp8yc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwbGljYWNp8yBjbGllbnQnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICA9ICdTaXN0ZW1hIE9wZXJhdGl1IGNsaWVudCc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ludGVncmF0JzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJlcyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwbGljYWNp8yBzZXJ2aWRvcic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgID0gJ1Npc3RlbWEgT3BlcmF0aXUgc2Vydmlkb3InOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICA9ICdFaW5hIGRcJ3VzdWFyaSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1VzdWFyaXMgY29uY3VycmVudHMnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgPSAnTGxpY+huY2lhIGRlIGRlc2Vudm9sdXBhbWVudCc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgID0gJ0xsaWPobmNpYSBjb3Jwb3JhdGl2YSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgTm9kZSc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgID0gJ1BlciBQcm9jZXNzYWRvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgID0gJ1BlciBTZXJ2aWRvcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBVc3VhcmknOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdMbGlj6G5jaWEgSW5kaXZpZHVhbCc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ1Jlc3RyaWNjafMgZGUgdGVtcHMnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICA9ICdJbLdsaW1pdGF0JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgPSAnTGxpY+huY2lhIHBlciB2b2x1bSc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVsJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTm9tYnJlIGRlIHPocmllJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgPSAnU2lzdGVtYSBPcGVyYXRpdSc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NQVSc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhbSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc2MgZHVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgPSAnRGlzYyBkdXI6OkNhcGFjaXRhdCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NhcGFjaXRhdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGFwdGFkb3IgZGUgeGFyeGEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGFwdGFkb3IgZGUgeGFyeGE6OklQIHBlciBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgPSAnQWRhcHRhZG9yIGRlIHhhcnhhOjpEaXJlY2Np8yBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgID0gJ0lQIHBlciBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgPSAnRGlyZWNjafMgSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGFwdGFkb3IgZ3LgZmljJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgPSAnQWx0ZXIgZXF1aXBhbWVudCc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgID0gJ0RhdGEgZGUgZmkgZGUgbGEgZ2FyYW50aWEnOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICA9ICdEYXRhIGRcJ2luc3RhbLdsYWNp8yc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgID0gJ0RpcmVjY2nzIGRlIHhhcnhhJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6U3VibmV0IE1hc2snfSAgPSAnRGlyZWNjafMgZGUgeGFyeGE6Ok3gc2NhcmEgZGUgc3VieGFyeGEnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICA9ICdEaXJlY2Np8yBkZSB4YXJ4YTo6UG9ydGEgZFwnZW5sbGHnJzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgPSAnTeBzY2FyYSBkZSBzdWJ4YXJ4YSc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BvcnRhIGRcJ2VubGxh5yc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgID0gJ1RpcHVzIGRlIGxsaWPobmNpYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgID0gJ0NsYXUgZGUgbGxpY+huY2lhJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgPSAnQ2xhdSBkZSBsbGlj6G5jaWE6OkN1YW50aXRhdCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gID0gJ0NsYXUgZGUgbGxpY+huY2lhOjpEYXRhIGRcJ2V4cGlyYWNp8yc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0N1YW50aXRhdCc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0RhdGEgZFwnZXhwaXJhY2nzJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ID0gJ05vbWJyZSBt4HhpbSBkXCd1biBlbGVtZW50JzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgPSAnSWRlbnRpZmljYWRvcic7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogY3pfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjYgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0tvbmZpZy4gamVkbm90a3kgQ0knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn2O16ZW7tIGtvbmZpZ3VyYehu7WNoIGplZG5vdGVrIENJJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdabexuYSBkZWZpbmljZSc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnVPjtZGEnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1VrYb4gVmVyemUnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ0hpZGUgVmVyemUnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ1Bvc2xlZG7tIHpt7G5hIG9kJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICdQb3NsZWRu7SB6bexuYSc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnWm3sbmEgZGVmaW5pY+0gbmX6c3DsuW7hISBWaXogc3lzdOltb3b9IHrhem5hbSBvIGRldGFqbGVjaC4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gICAgICAgID0gJ0hsZWRhdCB2IHD4ZWRjaG967WNoIHZlcnrtY2g/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdVa2F6YW7pIGtvbmZpZy5qZWRub3RreSc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICAgICAgICAgPSAnRG9zdHVwbukga29uZmlnLmplZG5vdGt5JzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICcnOwogICAgJExhbmctPnsnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgID0gJyc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG9zbGVkbu0gem3sbmEnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1pob3Rvdml0IGtvcGllJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWeXByY2hs6Sc7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmVha3Rpdm7tJzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfaZHK+YmEnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90LXb5ZGNlJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFub3bhbic7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZHVr6G7tJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcHJhdmEvT2Jub3Zlbu0nOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01pbW8gcHJvdm96JzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9obO2+ZW4nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvS29udHJvbGEga3ZhbGl0eSc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0b2xu7Sc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9iaWxu7Sc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3N0YXRu7Sc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1rhbG9ob3bhY+0gemH47Xplbu0nOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29tb3JhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEb2sgc3RhbmljZSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2zhdmVzbmljZSc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09icmF6b3ZrYSc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTXm5JzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPc3RhdG7tJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga2FydGEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rpc2vhcm5hJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSdWV0cic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU27tbWHoJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXpwZehub3N0bukgemH47Xplbu0nOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Nw7W5h6Cc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIHph+O16ZW7tJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOIGJvZCBw+O1zdHVwdSc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bu0nOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZG1pbmlzdHJh6G7tIG7hc3Ryb2onOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1W+aXZhdGVsc2vpIGFwbGlrYWNlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVvml2YXRlbHNr/SBvcGVyYehu7SBzeXN06W0nOwogICAgJExhbmctPnsnRW1iZWRkZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Zlc3Rhduxu/Sc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3T4ZWRu7SD6cm92ZfInOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bu0nOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcm924SBhcGxpa2FjZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmVyb3b9IG9wZXIuc3lzdOltJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVvml2YXRlbHNr/SBu4XN0cm9qJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLb25rdXJlbuhu7SB1vml2YXRlbOknOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2Ugdv12b2rh+GUnOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1BvZG5pa2F0ZWxza+EgbGljZW5jZSAnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlenBsYXRu/Sc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29mdHdhcmUgcyBvdGV2+GVu/W0gaz9kZW0nOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2924W7tIPp6bHUnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2924W7tIHBybyBwcm9jZXNvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5jb3bhbu0gcHJvIHNlcnZlcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5jb3bhbu0gcHJvIHW+aXZhdGVsZSc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSmVkbm90bGl24SBsaWNlbmNlJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfIYXNvduwgb21lemVu4SBsaWNlbmNlJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdOZW9tZXplbuEgbGljZW5jZSAnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NwZWNp4Wxu7SBvYuxtb3bpIHByb2dyYW15JzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+lyaW926SDo7XNsbyc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmHobu0gc3lzdOltJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9jZXNvcic7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFt7LsnOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1R2cmT9IGRpc2snOwogICAgJExhbmctPnsnSGFyZCBEaXNrOjpDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1R2cmT9IGRpc2s6OmthcGFjaXRhJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICc/S2FwYWNpdGEnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Ptu292/SBhZGFwdGVyJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICdT7btvdv0gYWRhcHRlcjo6SVAgeiBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICdT7btvdv0gYWRhcHRlcjo6SVAgYWRyZXNhJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCB6IERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIGFkcmVzYSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR3JhZmlja+Ega2FydGEnOwogICAgJExhbmctPnsnT3RoZXIgRXF1aXBtZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ppbukgdnliYXZlbu0nOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgID0gJ0tvbmVjIHBsYXRub3N0aSB64XJ1a3knOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdHVtIGluc3RhbGFjZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU+27b3bhIGFkcmVzYSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnU+27b3bhIGFkcmVzYTptYXNrYSBzdWJz7XTsJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgICA9ICdT7btvduEgYWRyZXNhOjpHYXRlIHD4ZWNob2QnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hc2thIHN1YnPtdOwnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGUgcPhlY2hvZCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHJ1aCBsaWNlbmNlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBrbO3oJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbuhu7SBrbO3oOjpNbm++c3R27Sc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnTGljZW7obu0ga2zt6Do6a29uZWMgcGxhdG5vc3RpJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNbm++c3R27Sc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS29uZWMgcGxhdG5vc3RpJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdN6WRpdW0nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jvb20nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01Db25maWdJdGVtLnBtLHYgMS43IDIwMDkvMDgvMzEgMTQ6Mzg6MDAgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW0nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJ0NvbmZpZyBJdGVtLUJlcmVpY2gnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0NvbmZpZyBJdGVtIFZlcndhbHR1bmcnOwogICAgJExhbmctPnsnQ2hhbmdlIERlZmluaXRpb24nfSAgICAgID0gJ0RlZmluaXRpb24g5G5kZXJuJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICdLbGFzc2UnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ1ZlcnNpb25lbiBlaW5ibGVuZGVuJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWZXJzaW9uZW4gYXVzYmxlbmRlbic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAnWnVsZXR6dCBnZeRuZGVydCB2b24nOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1p1bGV0enQgZ2XkbmRlcnQnOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ8RuZGVybiBkZXIgRGVmaW5pdGlvbiBmZWhsZ2VzY2hsYWdlbiEgSW0gU3lzdGVtIExvZyBmaW5kZW4gU2llIHdlaXRlcmUgSW5mb3JtYXRpb25lbi4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnQXVjaCBpbiBmcvxoZXJlbiBWZXJzaW9uZW4gc3VjaGVuPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICA9ICdDb25maWcgSXRlbXMgYW5nZXplaWd0JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtcyB2ZXJm/GdiYXInOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgPSAnQ29uZmlnIEl0ZW0gU3VjaGUnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnVmVyd2VuZHVuZ3NzdGF0dXMnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnQWt0dWVsbGVyIFZlcndlbmR1bmdzc3RhdHVzJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgID0gJ1ZvcmZhbGxzc3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0FrdHVlbGxlciBWb3JmYWxsc3N0YXR1cyc7CiAgICAkTGFuZy0+eydUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICAgICA9ICdEZXIgTmFtZSBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0RlciBWZXJ3ZW5kdW5nc3N0YXR1cyBkaWVzZXMgQ29uZmlnIEl0ZW1zJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRGVyIFZvcmZhbGxzc3RhdHVzIGRpZXNlcyBDb25maWcgSXRlbXMnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMZXR6dGUgxG5kZXJ1bmcnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEdXBsaXppZXJlbic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FiZ2VsYXVmZW4nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmFrdGl2JzsKICAgICRMYW5nLT57J01haW50ZW5hbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW4gV2FydHVuZyc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90YmV0cmllYic7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dlcGxhbnQnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWt0aXYnOwogICAgJExhbmctPnsnUmVwYWlyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbiBSZXBhcmF0dXInOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdd9lciBEaWVuc3QnOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVbnRlciBSZXZpZXcnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZXN0L1FTJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlcmF0aXYnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWb3JmYWxsJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVza3RvcCc7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhcHRvcCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb24nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYWNrdXAgR2Vy5HQnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWFtZXInOwogICAgJExhbmctPnsnQ2FtZXJhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEb2NraW5nIFN0YXRpb24nOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUYXN0YXR1cic7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vZGVtJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9uaXRvcic7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hdXMnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEgS2FydGUnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEcnVja2VyJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Nhbm5lcic7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NpY2hlcnRoZWl0c2dlcuR0JzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3dpdGNoJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVVNCIEdlcuR0JzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTiBBY2Nlc3MgUG9pbnQnOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxrbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZG1pbiBUb29sJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQ2xpZW50IEFud2VuZHVuZyc7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NsaWVudCBCZXRyaWVic3N5c3RlbSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmVkZGVkJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NvbnN0aWdlcyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlciBBbndlbmR1bmcnOwogICAgJExhbmctPnsnU2VydmVyIE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgQmV0cmllYnNzeXN0ZW0nOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVc2VyIFRvb2wnOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHbGVpY2h6ZWl0aWdlIFVzZXInOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRW50d2lja2xlciBMaXplbnonOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdFbnRlcnByaXNlIExpemVueic7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gS25vdGVuJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvIFByb3plc3Nvcic7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BybyBTZXJ2ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm8gQmVudXR6ZXInOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFaW56ZWxsaXplbnonOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdaZWl0bGljaCBiZWdyZW56dCc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VubGltaXRpZXJ0JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lbiBMaXplbnonOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbCc7CiAgICAkTGFuZy0+eydTZXJpYWwgTnVtYmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Nlcmllbm51bW1lcic7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0JldHJpZWJzc3lzdGVtJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ1BVJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJiZWl0c3NwZWljaGVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRmVzdHBsYXR0ZSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ0Zlc3RwbGF0dGU6OkthcGF6aXTkdCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcGF6aXTkdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR6d2VyayBBZGFwdGVyJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgPSAnTmV0endlcmsgQWRhcHRlcjo6SVAg/GJlciBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnTmV0endlcmsgQWRhcHRlcjo6SVAgQWRkcmVzc2UnOwogICAgJExhbmctPnsnSVAgb3ZlciBESENQJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCD8YmVyIERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJUCBBZGRyZXNzZSc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dyYWZpayBBZGFwdGVyJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnU29uc3RpZ2UgQXVzc3RhdHR1bmcnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICdHYXJhbnRpZSBBYmxhdWZkYXR1bSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luc3RhbGxhdGlvbnNkYXR1bSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ05ldHp3ZXJrIEFkZHJlc3NlJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6U3VibmV0IE1hc2snfSAgICAgICAgICAgPSAnTmV0endlcmsgQWRkcmVzc2U6OlN1Ym5ldHogTWFza2UnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICdOZXR6d2VyayBBZGRyZXNzZTo6R2F0ZXdheSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N1Ym5ldHogTWFza2UnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56dHlwJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56c2NobPxzc2VsJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgPSAnTGl6ZW56c2NobPxzc2VsOjpNZW5nZSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ0xpemVuenNjaGz8c3NlbDo6QWJsYXVmZGF0dW0nOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZW5nZSc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FibGF1ZmRhdHVtJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaXVtJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgPSAnTWF4aW1hbGUgQW56YWhsIGVpbmVzIEVsZW1lbnRzJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSWRlbnRpZmlrYXRvcic7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb24gMSc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb24gMic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkcmVzc2UnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHZWLkdWRlJzsKICAgICRMYW5nLT57J0Zsb29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXRhZ2UnOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJVCBFaW5yaWNodHVuZyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0L8cm8nOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbnNjaGx1c3Nkb3NlJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmFjayc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhdW0nOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBcmJlaXRzcGxhdHonOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpDb25maWdJdGVtQ3JlYXRlJ30gICAgICAgICAgICA9ICdOZXVlcyBDb25maWdJdGVtIChJRD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWZXJzaW9uQ3JlYXRlJ30gICAgICAgICAgICAgICA9ICdOZXVlIFZlcnNpb24gZXJ6ZXVndCAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6RGVwbG95bWVudFN0YXRlVXBkYXRlJ30gICAgICAgPSAnVmVyd2VuZHVuZ3NzdGF0dXMgZ2XkbmRlcnQgKG5ldT0lczsgYWx0PSVzKSc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkluY2lkZW50U3RhdGVVcGRhdGUnfSAgICAgICAgID0gJ1ZvcmZhbGxzc3RhdHVzIGdl5G5kZXJ0IChuZXU9JXM7IGFsdD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpDb25maWdJdGVtRGVsZXRlJ30gICAgICAgICAgICA9ICdDb25maWdJdGVtIChJRD0lcykgZ2Vs9nNjaHQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpMaW5rQWRkJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaW5rIGF1ZiAlcyAoVHlwPSVzKSBoaW56dWdlZvxndCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkxpbmtEZWxldGUnfSAgICAgICAgICAgICAgICAgID0gJ0xpbmsgYXVmICVzIChUeXA9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6RGVmaW5pdGlvblVwZGF0ZSd9ICAgICAgICAgICAgPSAnRGVmaW5pdGlvbiBkZXMgQ29uZmlnSXRlbXMgYWt0dWFsaXNpZXJ0IChJRD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpOYW1lVXBkYXRlJ30gICAgICAgICAgICAgICAgICA9ICdOYW1lIGdl5G5kZXJ0IChuZXU9JXM7IGFsdD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWYWx1ZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdBdHRyaWJ1dCAlcyB2b24gIiVzIiBhdWYgIiVzIiBnZeRuZGVydCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OlZlcnNpb25EZWxldGUnfSAgICAgICAgICAgICAgID0gJ1ZlcnNpb24gJXMgZ2Vs9nNjaHQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBlbmdsaXNoIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBlbl9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA4LzMxIDE0OjM4OjAwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplbl9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpDb25maWdJdGVtQ3JlYXRlJ30gICAgICAgICAgICA9ICdOZXcgQ29uZmlnSXRlbSAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6VmVyc2lvbkNyZWF0ZSd9ICAgICAgICAgICAgICAgPSAnTmV3IHZlcnNpb24gKElEPSVzKSc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkRlcGxveW1lbnRTdGF0ZVVwZGF0ZSd9ICAgICAgID0gJ0RlcGxveW1lbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6SW5jaWRlbnRTdGF0ZVVwZGF0ZSd9ICAgICAgICAgPSAnSW5jaWRlbnQgc3RhdGUgdXBkYXRlZCAobmV3PSVzOyBvbGQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6Q29uZmlnSXRlbURlbGV0ZSd9ICAgICAgICAgICAgPSAnQ29uZmlnSXRlbSAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpMaW5rQWRkJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaW5rIHRvICVzICh0eXBlPSVzKSBhZGRlZCc7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OkxpbmtEZWxldGUnfSAgICAgICAgICAgICAgICAgID0gJ0xpbmsgdG8gJXMgKHR5cGU9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpEZWZpbml0aW9uVXBkYXRlJ30gICAgICAgICAgICA9ICdDb25maWdJdGVtc1wnIGRlZmluaXRpb24gdXBkYXRlZCAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NJSGlzdG9yeTo6TmFtZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnTmFtZSB1cGRhdGVkIChuZXc9JXM7IG9sZD0lcyknOwogICAgJExhbmctPnsnQ0lIaXN0b3J5OjpWYWx1ZVVwZGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdBdHRyaWJ1dGUgJXMgdXBkYXRlZCBmcm9tICIlcyIgdG8gIiVzIic7CiAgICAkTGFuZy0+eydDSUhpc3Rvcnk6OlZlcnNpb25EZWxldGUnfSAgICAgICAgICAgICAgID0gJ1ZlcnNpb24gJXMgZGVsZXRlZCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0lUU01Db25maWdJdGVtLnBtLHYgMS42IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICdFbGVtZW50byBkZSBDb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdBcmVhIGRlIENvbmZpZ3VyYWNp824gZGUgRWxlbWVudG9zJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0afNuIGRlIEVsZW1lbnRvcyBkZSBDb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdNb2RpZmljYXIgRGVmaW5pY2nzbic7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc2UnOwogICAgJExhbmctPnsnU2hvdyBWZXJzaW9ucyd9ICAgICAgICAgID0gJ01vc3RyYXIgVmVyc2lvbmVzJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdPY3VsdGFyIFZlcnNpb25lcyc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAnVWx0aW1hIG1vZGlmaWNhY2nzbiBwb3InOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYWNp824nOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ0FjdHVhbGl6YWNp824gZGUgZGVmaW5pY2lvbmVzIGZhbGxpZGEhIFJldmlzYXIgZWwgTG9nIGRlbCBTaXN0ZW1hIHBhcmEgY29uc3VsdGFyIGRldGFsbGVzJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ2J1c2NhciBlbiB2ZXJzaW9uZXMgYW50ZXJpb3Jlcz8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudG9zIGRlIGNvbmZpZ3VyYWNp824gbW9zdHJhZG9zJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0VsZW1lbnRvcyBkZSBjb25maWd1cmFjafNuIGRpc3BvbmlibGVzJzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgID0gJ0J1c2NhciBlbGVtZW50b3MgZGUgY29uZmlndXJhY2nzbic7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdFc3RhZG8gZGUgaW1wbGVtZW50YWNp824nOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnRXN0YWRvIGFjdHVhbCBkZSBpbXBsZW1lbnRhY2nzbic7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdFc3RhZG8gZGVsIEluY2lkZW50ZSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICdFc3RhZG8gQWN0dWFsIGRlbCBJbmNpZGVudGUnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnRWwgbm9tYnJlIGRlIGVzdGUgZWxlbWVudG8gZGUgY29uZmlndXJhY2nzbic7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdFbCBlc3RhZG8gZGUgaW1wbGVtZW50YWNp824gZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30KICAgICAgICA9ICdFbCBlc3RhZG8gZGUgZXN0ZSBlbGVtZW50byBkZSBjb25maWd1cmFjafNuJzsKICAgICRMYW5nLT57J0xhc3QgQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgPSAnVWx0aW1hIG1vZGlmaWNhY2nzbic7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpY2Fkbyc7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGlyYWRvJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnSW5hY3Rpdm8nOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICA9ICdNYW50ZW5pbWllbnRvJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGlsb3RvJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGxhbmlmaWNhZG8nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdWNjafNuJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmVwYXJhY2nzbic7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1JldGlyYWRvJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmV2aXNhZG8nOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQcnVlYmFzJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlcmFjaW9uYWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudGUnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YXRpbCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ090cm8nOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZ2VuZGEgUGVyc29uYWwnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWzpZm9ubyc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZpZG9yJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gZGUgQ29waWFzJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmlkZW8gQmVhbSc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0PhbWFyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1RlY2xhZG8nOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdHJvJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgPSAnVGFyamV0YSBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXByZXNvcmEnOwogICAgJExhbmctPnsnUm91dGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdFbnJ1dGFkb3InOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdFc2NhbmVyJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gZGUgc2VndXJpZGFkJzsKICAgICRMYW5nLT57J1N3aXRjaCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgPSAnRGlzcG9zaXRpdm8gVVNCJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3Rybyc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgID0gJ0hlcnJhbWllbnRhIGRlIEFkbWluaXN0cmFkb3InOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICA9ICdBcGxpY2FjafNuIENsaWVudGUnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICA9ICdTTyBDbGllbnRlJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWJpZG8nOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdHJvJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgPSAnQXBsaWNhY2nzbiBTZXJ2aWRvcic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgID0gJ1NPIFNlcnZpZG9yJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgPSAnSGVycmFtaWVudGEgZGUgVXN1YXJpbyc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1VzdWFyaW9zIGNvbmN1cnJlbnRlcyc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW9zdHJhY2nzbic7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgID0gJ0xpY2VuY2lhIGRlIERlc2Fycm9sbGFkb3InOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICA9ICdMaWNlbmNpYSBDb3Jwb3JhdGl2YSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BvciBOb2RvJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgPSAnUG9yIFByb2Nlc2Fkb3InOwogICAgJExhbmctPnsnUGVyIFNlcnZlcid9ICAgICAgICAgICAgICAgICAgICA9ICdQb3IgU2Vydmlkb3InOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICA9ICdQb3IgVXN1YXJpbyc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ1RpZW1wbyByZXN0cmluZ2lkYSc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ0lsaW1pdGFkYSc7CiAgICAkTGFuZy0+eydWb2x1bWUgTGljZW5jZSd9ICAgICAgICAgICAgICAgID0gJ0xpY2VuY2lhIHBvciBWb2x1bWVuJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWxvJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTnVtZXJvIFNlcmlhbCc7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgID0gJ1Npc3RlbWEgT3BlcmF0aXZvJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgPSAnRGlzY28gRHVybyc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgID0gJ0Rpc2NvIER1cm86OkNhcGFjaWRhZCc7CiAgICAkTGFuZy0+eydDYXBhY2l0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NhcGFjaWRhZCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgID0gJ0FkYXB0YWRvciBkZSBSZWQnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGFwdGFkb3IgZGUgUmVkOjpJUCBTb2JyZSBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgPSAnQWRhcHRhZG9yIGRlIFJlZDo6RGlyZWNjafNuIElQJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgPSAnSVAgc29icmUgREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgID0gJ0RpcmVjY2nzbiBJUCc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgID0gJ1RhcmpldGEgR3LhZmljYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgID0gJ090cm8gZXF1aXBvJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgPSAnRmVjaGEgZGUgRXhwaXJhY2nzbiBkZSBsYSBHYXJhbnTtYSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgID0gJ0ZlY2hhIGRlIEluc3RhbGFjafNuJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgPSAnRGlyZWNjafNuIGRlIFJlZCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gID0gJ0RpcmVjY2nzbiBkZSBSZWQ6Ok1hc2NhcmEgZGUgU3VicmVkJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgPSAnRGlyZWNjafNuIGRlIFJlZDo6UHVlcnRhIGRlIGVubGFjZSc7CiAgICAkTGFuZy0+eydTdWJuZXQgTWFzayd9ICAgICAgICAgICAgICAgICAgID0gJ01hc2NhcmEgZGUgU3VicmVkJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUHVlcnRhIGRlIGVubGFjZSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgID0gJ1RpcG8gZGUgTGljZW5jaWEnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICA9ICdDbGF2ZSBkZSBMaWNlbmNpYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgID0gJ0NsYXZlIGRlIExpY2VuY2lhOjpDYW50aWRhZCc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gID0gJ0NsYXZlIGRlIExpY2VuY2lhOjpGZWNoYSBkZSBFeHBpcmFjafNuJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAnQ2FudGlkYWQnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICdGZWNoYSBkZSBFeHBpcmFjafNuJzsKICAgICRMYW5nLT57J01lZGlhJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVkaW8nOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYXhpbW8gbnVtZXJvIGRlIHVuIGVsZW1lbnRvICc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpY2Fkb3InOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUmFjayd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgZmFfSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzoxMToxOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0NvbmZpZyBJdGVtJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICfZhdit2K/ZiNiv2YcgQ0knOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiBDSSc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAn2KrYutuM24zYsSDYqti52LHbjNmBJzsKICAgICRMYW5nLT57J0NsYXNzJ30gICAgICAgICAgICAgICAgICA9ICfaqdmE2KfYsyc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAn2YjbjNix2KfbjNi04oCM2YfYpyDYsdinINmG2YXYp9uM2LQg2KjYr9mHJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICfZiNuM2LHYp9uM2LTigIzZh9inINix2Kcg2YXYrtmB24wg2qnZhic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQgYnknfSAgICAgICAgPSAn2KLYrtix24zZhiDYqti624zbjNixINio2Ycg2YjYs9uM2YTZhyc7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAn2KLYrtix24zZhiDYqti624zbjNixJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30KICAgICAgICA9ICfYudmF2YTbjNin2Kog2KrYutuM24zYsSDYqti52LHbjNmBINmG2KfZhdmI2YHZgiDYqNmI2K8uINio2LHYp9uMINqp2LPYqCDYp9i32YTYp9i5INio24zYtNiq2LEgbG9nINiz24zYs9iq2YUg2LHYpyDYqNio24zZhtuM2K8uJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ9iv2LEg2YjbjNix2KfbjNi04oCM2YfYp9uMINmC2KjZhNuMINmH2YUg2KzYs9iq2KzZiCDYp9mG2KzYp9mFINi02YjYr9ifJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0NJ2YfYp9uMINmG2YXYp9uM2LQg2K/Yp9iv2Ycg2LTYr9mHJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgID0gJ0NJ2YfYp9uMINiv2LEg2K/Ys9iq2LHYsyc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINmG2LXYqCDYr9ixINmF2K3ZhCc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICfZiNi22LnbjNiqINmB2LnZhNuMINmG2LXYqCc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICfZiNi22LnbjNiqINix2K7Yr9in2K8nOwogICAgJExhbmctPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgPSAn2YjYtti524zYqiDYrNin2LHbjCDYsdiu2K/Yp9ivJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ9mG2KfZhSDYp9uM2YYgQ0nZh9inJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ9mI2LbYuduM2Kog2YbYtdioINin24zZhiBDSSc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9mI2LbYuduM2Kog2LHYrtiv2KfYryDYp9uM2YYgQ0knOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYotiu2LHbjNmGINiq2LrbjNuM2LEnOwogICAgJExhbmctPnsnRHVwbGljYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYqtqp2KvbjNixJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXZhtmC2LbbjCDYtNiv2YcnOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LEg2YHYudin2YQnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZvti02KrbjNio2KfZhtuMINmIINmG2q/Zh9iv2KfYsduMJzsKICAgICRMYW5nLT57J1BpbG90J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbZhdmI2YbZhyDYotiy2YXYp9uM2LTbjCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2LHZhtin2YXZhyDYsduM2LLbjCDYtNiv2YcnOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9ixINit2KfZhCDYqtmI2YTbjNivJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYudmF24zYsSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2KfYstmG2LTYs9iq2Ycg2LTYr9mHJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjYp9iy2KjbjNmG24wnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYqtiz2Kov2KrYttmF24zZhiDaqduM2YHbjNiqJzsKICAgICRMYW5nLT57J09wZXJhdGlvbmFsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LnZhdmE24zYp9iq24wnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYsdiu2K/Yp9ivJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LHZiNmF24zYstuMJzsKICAgICRMYW5nLT57J0xhcHRvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2qnbjNmB24wnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LHZhyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BEQSc7CiAgICAkTGFuZy0+eydQaG9uZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2YTZgdmGJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPYsdmI2LEnOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZiNiz2KfbjNmEINm+2LTYqtuM2KjYp9mG4oCM2q/bjNix24wnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZvtix2KrZiCDYp9mB2qnZhic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iv2YjYsdio24zZhic7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in24zYs9iq2q/Yp9mHINin2KrYtdin2YQnOwogICAgJExhbmctPnsnS2V5Ym9yZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYtdmB2K3ZhyDaqdmE24zYryc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2YjYr9mFJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LXZgdit2Ycg2YbZhdin24zYtCc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2KfZiNizJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LrbjNix2YcnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfaqdin2LHYqiBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfahtin2b7ar9ixJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYs9uM2LHbjNin2KgnOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9iz2qnZhtixJzsKICAgICRMYW5nLT57J1NlY3VyaXR5IERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YjYs9in24zZhCDYp9mF2YbbjNiq24wnOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYs9mI24zahic7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2KzZh9uM2LLYp9iqIFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ9mG2YLYp9i3INiv2LPYqtix2LPbjCBXTEFOJzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LrbjNix2YcnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxjbyc7CiAgICAkTGFuZy0+eydXTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9io2LLYp9ixINmF2K/bjNix24zYqtuMJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2KjYsdmG2KfZhdmH4oCM2YfYp9uMINqp2YTYp9uM2YbYqic7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iz24zYs9iq2YUg2LnYp9mF2YQg2qnZhNin24zZhtiqJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2K/Yp9iu2YTbjCc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF24zYp9mGINin2YHYstin2LEnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYutuM2LHZhyc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ9mG2LHZhSDYp9mB2LLYp9ixINiz2LHZiNixJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPbjNiz2KrZhSDYudin2YXZhCDYs9ix2YjYsSc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in2KjYstin2LEg2qnYp9ix2KjYsSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2KfYsdio2LHYp9mGINmF2YjYp9iy24wnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhtiz2K7ZhyDZhtmF2KfbjNi024wnOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2KrZiNiz2LnZhyDYr9mH2YbYr9mHJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAn2KfYrNin2LLZh+KAjNmG2KfZhdmHINiz2KfYstmF2KfZhtuMJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbYsdmFINin2YHYstin2LEg2YXYrNin2YbbjCc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2K8g2KjYp9iyJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDaqdin2YXZvtuM2YjYqtixJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDZvtix2K/Yp9iy2LTar9ixJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KjZhyDYp9iy2KfbjCDYs9ix2YjYsSc7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9io2Ycg2KfYstin24wg2qnYp9ix2KjYsSc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9in2KzYp9iy2YfigIzZhtin2YXZhyDYqtqp24wnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9in2LHYp9uMINmF2K3Yr9mI2K/ZhyDYstmF2KfZhtuMJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbYp9mF2K3Yr9mI2K8nOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9is2KfYstmH4oCM2YbYp9mF2Ycg2K3YrNmF24wnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhdiv2YQnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYtNmF2KfYsdmHINiz2LHbjNin2YQnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfYs9uM2LPYqtmFINi52KfZhdmEJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPbjOKAjNm+24zigIzbjNmIJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LHZhSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mH2KfYsdivINiv24zYs9qpJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAn2YfYp9ix2K8g2K/bjNiz2qk6Oti42LHZgduM2KonOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYuNix2YHbjNiqJzsKICAgICRMYW5nLT57J0ZRRE4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRlFETic7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2KfYsdiqINi02KjaqdmHJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgPSAn2qnYp9ix2Kog2LTYqNqp2Yc6OklQINin2LIg2LfYsduM2YIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgID0gJ9qp2KfYsdiqINi02KjaqdmHOjrYotiv2LHYsyBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQINin2LIg2LfYsduM2YIgREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9ii2K/YsdizIElQJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2qnYp9ix2Kog2q/Ysdin2YHbjNqpJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYrNmH24zYstin2Kog2YXYqtmB2LHZgtmHJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYp9mG2YLYttin24wg2LbZhdin2YbYquKAjNmG2KfZhdmHJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDZhti12KgnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfYotiv2LHYsyDYtNio2qnZhyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ9ii2K/YsdizINi02KjaqdmHOjpTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgICAgICAgICAgID0gJ9ii2K/YsdizINi02KjaqdmHOjpHYXRld2F5JzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3VibmV0IE1hc2snOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YbZiNi5INin2KzYp9iy2YfigIzZhtin2YXZhyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhyc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhzo62KrYudiv2KfYryc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgID0gJ9qp2YTbjNivINin2KzYp9iy2YfigIzZhtin2YXZhzo62KrYp9ix24zYriDYp9mG2YLYttinJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KrYudiv2KfYryc7CiAgICAkTGFuZy0+eydFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2KfYsduM2K4g2KfZhtmC2LbYpyc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9ix2LPYp9mG2YcnOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSAgICAgICAgICA9ICfYrdiv2Kfaqdir2LEg2LTZhdin2LHZhyDbjNqpINi52YbYtdixJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YXYudix2YEnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfZhti02KfZhtuMJzsKICAgICRMYW5nLT57J0J1aWxkaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2LPYp9iu2KrZhdin2YYnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYt9io2YLZhyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9iq2LPZh9uM2YTYp9iqIElUJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2KfYr9in2LHZhyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9m+2LHbjNiyJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn2YLZgdiz2YcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfYp9iq2KfZgic7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9mF2K3ZhCDaqdin2LEnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjQxOjA2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnRWzpbWVudCBkZSBjb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdab25lIGRlcyBFbOltZW50cyBkZSBDb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGRlcyBFbOltZW50cyBkZSBDb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdE6WZpbml0aW9uIGR1IENoYW5nZW1lbnQnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ0NsYXNzZSc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnTW9udHJlciBsZXMgVmVyc2lvbnMnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ0NhY2hlciBsZXMgVmVyc2lvbnMnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ0Rlcm5p6HJlIG1vZGlmaWNhdGlvbiBlZmZlY3R16WUgcGFyJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICdEZXJuaehyZSBtb2RpZmljYXRpb24nOwogICAgJExhbmctPnsnQ2hhbmdlIG9mIGRlZmluaXRpb24gZmFpbGVkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4nfQogICAgICAgID0gJ01vZGlmaWNhdGlvbiBkZSBsYSBk6WZpbml0aW9uIOljaG916WUhIFJlZ2FyZGV6IGxlcyBMb2cgU3lzdOhtZXMgcG91ciBwbHVzIGRlIGTpdGFpbHMuJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0NoZXJjaGVyIOlnYWxlbWVudCBkYW5zIGxlcyB2ZXJzaW9ucyBwculj6WRlbnRlcz8/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0Vs6W1lbnRzIGRlIGNvbmZpZ3VyYXRpb24gbW9udHLpcyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdFbOltZW50cyBkZSBjb25maWd1cmF0aW9uIGRpc3BvbmlibGVzJzsKICAgICRMYW5nLT57J1NlYXJjaCBDb25maWcgSXRlbXMnfSAgICAgICAgICAgICAgID0gJ0NoZXJjaGVyIGRhbnMgbGVzIOls6W1lbnRzIGRlIGNvbmZpZ3VyYXRpb24nOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnRXRhdCBkZSBk6XBsb2llbWVudCc7CiAgICAkTGFuZy0+eydDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICA9ICdFdGF0IGFjdHVlbCBkZSBk6XBsb2llbWVudCc7CiAgICAkTGFuZy0+eydJbmNpZGVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgICA9ICdFdGF0IGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0V0YXQgYWN0dWVsIGRlIGxcJ2luY2lkZW50JzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0xlIG5vbSBkZSBjZXQg6WzpbWVudCBkZSBjb25maWd1cmF0aW9uJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0xcJ+l0YXQgZGUgZOlwbG9pZW1lbnQgZGUgY2V0IOls6W1lbnQgZGUgY29uZmlndXJhdGlvbic7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ0xcJ+l0YXQgZFwnaW5jaWRlbnQgZGUgY2V0IOls6W1lbnQgZGUgY29uZmlndXJhdGlvbic7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlcm5p6HJlIG1vZGlmaWNhdGlvbic7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpcXVlcic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cGly6Sc7CiAgICAkTGFuZy0+eydJbmFjdGl2ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luYWN0aWYnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNYWludGVuYW5jZSc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90ZSc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BsYW5pZmnpJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUHJvZHVjdGlvbic7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VuIHLpcGFyYXRpb24nOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXRpcuknOwogICAgJExhbmctPnsnUmV2aWV3J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSZXZ1ZSc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcOlyYXRpb25uZWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudCc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09yZGluYXRldXInOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YWJsZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1dHJlJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVOls6XBob25lJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2VydmV1cic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VsZW1lbnQgZGUgc2F1dmVnYXJkZSc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1LpdHJvcHJvamVjdGV1cic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhbelyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Jhc2UgcG91ciBQb3J0YWJsZSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NsYXZpZXInOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0ZXVyJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU291cmlzJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXV0cmUnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYXJ0ZSBQQ01DSUEnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbXByaW1hbnRlJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGV1cic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYW5uZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQ6XJpcGjpcmlxdWUgZGUgc+ljdXJpdOknOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTd2l0Y2gnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQ6XJpcGjpcmlxdWUgVVNCJzsKICAgICRMYW5nLT57J1dMQU4gQWNjZXNzIFBvaW50J30gICAgICAgICAgICAgICAgICAgICAgPSAnUG9pbnQgZFwnYWNjZXNzIFdMQU4nOwogICAgJExhbmctPnsnR1NNJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMQU4nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBdXRyZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dGlsIGRcJ0FkbWluaXN0cmF0aW9uJzsKICAgICRMYW5nLT57J0NsaWVudCBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQXBwbGljYXRpb24gQ2xpZW50ZSc7CiAgICAkTGFuZy0+eydDbGllbnQgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09TIENsaWVudCc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmFycXXpJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0F1dHJlJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnQXBwbGljYXRpb24gU2VydmV1cic7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09TIFNlcnZlcic7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ091dGlsIFV0aWxpc2F0ZXVyJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVXRpbGlzYXRldXJzIGNvbmN1cnJlbnRzJzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGVtbyc7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2Vuc2UgROl2ZWxvcHBldXInOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIEVudHJlcHJpc2UnOwogICAgJExhbmctPnsnRnJlZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcmVld2FyZS9HcmF0aWNpZWwnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVuIFNvdXJjZSc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhciBub2V1ZCc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhciBwcm9jZXNzZXVyJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGFyIFNlcnZldXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXIgVXRpbGlzYXRldXInOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnNlIHVuaXF1ZSc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpbWl06WUgZGFucyBsZSB0ZW1wcyc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lsbGltaXTpJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnTGljZW5zZSBwYXIgdm9sdW1lJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9k6GxlJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTnVt6XJvIGRlIHPpcmllJzsKICAgICRMYW5nLT57J09wZXJhdGluZyBTeXN0ZW0nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnU3lzdOhtZSBkXCdleHBsb2l0YXRpb24nOwogICAgJExhbmctPnsnQ1BVJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDUFUnOwogICAgJExhbmctPnsnUmFtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdSQU0nOwogICAgJExhbmctPnsnSGFyZCBEaXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEaXNxdWUgZHVyJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAnRGlzcXVlIGR1cjo6Q2FwYWNpdOknOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYXBhY2l06Sc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdBZGFwdGF0ZXVyIHLpc2VhdSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIG92ZXIgREhDUCd9ICAgICAgICAgID0gJ0FkYXB0YXRldXIgculzZWF1OjpJUCBzdXIgREhDUCc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkYXB0ZXI6OklQIEFkZHJlc3MnfSAgICAgICAgICAgID0gJ0FkYXB0YXRldXIgculzZWF1OjogQWRyZXNzZSBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIHN1ciBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBJUCc7CiAgICAkTGFuZy0+eydHcmFwaGljIEFkYXB0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkYXB0YXRldXIgZ3JhcGhpcXVlJzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXV0cmUg6XF1aXBlbWVudCc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgICAgID0gJ0RhdGUgZFwnZXhwaXJhdGlvbiBkZSBsYSBnYXJhbnRpZSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGUgZFwnaW5zdGFsbGF0aW9uJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBy6XNlYXUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpTdWJuZXQgTWFzayd9ICAgICAgICAgICA9ICdBZHJlc3NlIHLpc2VhdTo6TWFzcXVlIGR1IHNvdXMgculzZWF1JzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgPSAnQWRyZXNzZSBy6XNlYXU6OlBhc3NlcmVsbGUnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNYXNxdWUgZHUgc291cyBy6XNlYXUnOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQYXNzZXJlbGxlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHlwZSBkZSBsaWNlbnNlJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2zpIGRlIGxhIGxpY2Vuc2UnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdDbOkgZGUgbGEgbGljZW5zZTo6UXVhbnRpdOknOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICA9ICdDbOkgZGUgbGEgbGljZW5zZTo6RGF0ZSBkXCdleHBpcmF0aW9uJzsKICAgICRMYW5nLT57J1F1YW50aXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUXVhbnRpdOknOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdEYXRlIGRcJ2V4cGlyYXRpb24nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWRpYSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ1F1YW50aXTpIG1heGltYWxlIHBvdXIgdW4g6WzpbWVudCc7CiAgICAkTGFuZy0+eydJZGVudGlmaWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lkZW50aWZpYW50JzsKICAgICRMYW5nLT57J1Bob25lIDEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVOls6XBob25lIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdU6WzpcGhvbmUgMic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkcmVzc2UnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYXRpbWVudCc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V0YWdlJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnROlwYXJ0ZW1lbnQgSVQnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCdXJlYXUnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcmlzZSc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaehjZSc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VtcGxhY2VtZW50JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9JVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA3LzIwIDEzOjExOjE4IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydDb25maWcgSXRlbSd9ICAgICAgICAgICAgPSAnRWxlbWVudG8gZGkgQ29uZmlndXJhemlvbmUnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJ0FyZWEgZGkgQ29uZmlndXJhemlvbmUgZGVnbGkgRWxlbWVudGknOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb25lIGRlZ2xpIEVsZW1lbnRpIGRpIENvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICdNb2RpZmljYSBEZWZpbml6aW9uZSc7CiAgICAkTGFuZy0+eydDbGFzcyd9ICAgICAgICAgICAgICAgICAgPSAnQ2xhc3NlJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICdNb3N0cmEgVmVyc2lvbmknOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ05hc2NvbmRpIFZlcnNpb25pJzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCBieSd9ICAgICAgICA9ICdVbHRpbWEgbW9kaWZpY2EgZGknOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkJ30gICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYSc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9ID0gJ0FnZ2lvcm5hbWVudG8gZGVsbGUgZGVmaW5pemlvbmkgZmFsbGl0YSEgR3VhcmRhIG5lbCBMb2cgZGVsIFNpc3RlbWEgcGVyIGRldHRhZ2xpJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ID0gJ0NlcmNhcmUgYW5jaGUgaW4gdmVyc2lvbmkgcHJlY2VkZW50aT8nOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIHNob3duJ30gICAgICAgICAgICAgICAgPSAnRWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUgbW9zdHJhdGknOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgPSAnRWxlbWVudGkgZGkgY29uZmlndXJhemlvbmUgZGlzcG9uaWJpbGknOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgPSAnUmljZXJjYSBlbGVtZW50aSBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICA9ICdTdGF0byBkaSBpbXBsZW1lbnRhemlvbmUnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgPSAnU3RhdG8gYXR0dWFsZSBkaSBpbXBsZW1lbnRhemlvbmUnOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAnU3RhdG8gZGVsbFwnSW5jaWRlbnRlJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ1N0YXRvIGF0dHVhbGUgZGVsbFwnSW5jaWRlbnRlJzsKICAgICRMYW5nLT57J1RoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSAgICAgID0gJ0lsIG5vbWUgZGkgcXVlc3RvIGVsZW1lbnRvIGRpIGNvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfSA9ICdMbyBzdGF0byBkaSBpbXBsZW1lbnRhemlvbmUgZGkgcXVlc3RvIGVsZW1lbnRvIGRpIGNvbmZpZ3VyYXppb25lJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnTG8gc3RhdG8gZGkgaW5jaWRlbnRlIGRpIHF1ZXN0byBlbGVtZW50byBkaSBjb25maWd1cmF6aW9uZSc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgID0gJ1VsdGltYSBtb2RpZmljYSc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0R1cGxpY2F0byc7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYWR1dG8nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbmF0dGl2byc7CiAgICAkTGFuZy0+eydNYWludGVuYW5jZSd9ICAgICAgICAgICAgICAgICAgID0gJ01hbnV0ZW56aW9uZSc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BpbG90JzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUGlhbmlmaWNhdG8nOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICA9ICdQcm9kdXppb25lJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnUmlwYXJhemlvbmUnOwogICAgJExhbmctPnsnUmV0aXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdSaXRpcmF0byc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JldmlzaW9uYXRvJzsKICAgICRMYW5nLT57J1Rlc3QvUUEnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVzdCc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgID0gJ09wZXJhdGl2byc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50ZSc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdQb3J0YXRpbGUnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBbHRybyc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BhbG1hcmUnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9ubyc7CiAgICAkTGFuZy0+eydTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcic7CiAgICAkTGFuZy0+eydCYWNrdXAgRGV2aWNlJ30gICAgICAgICAgICAgICAgID0gJ0Rpc3Bvc2l0aXZvIGRpIENvcGlhJzsKICAgICRMYW5nLT57J0JlYW1lcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnVmlkZW8gQmVhbSc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZpZGVvY2FtZXJhJzsKICAgICRMYW5nLT57J0RvY2tpbmcgU3RhdGlvbid9ICAgICAgICAgICAgICAgPSAnRG9ja2luZyBTdGF0aW9uJzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnVGFzdGllcmEnOwogICAgJExhbmctPnsnTW9kZW0nfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbSc7CiAgICAkTGFuZy0+eydNb25pdG9yJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb3VzZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgPSAnU2NoZWRhIFBDTUNJQSc7CiAgICAkTGFuZy0+eydQcmludGVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YW1wYW50ZSc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JvdXRlcic7CiAgICAkTGFuZy0+eydTY2FubmVyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1NjYW5uZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl2byBkaSBzaWN1cmV6emEnOwogICAgJExhbmctPnsnU3dpdGNoJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdTd2l0Y2gnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICA9ICdEaXNwb3NpdGl2byBVU0InOwogICAgJExhbmctPnsnV0xBTiBBY2Nlc3MgUG9pbnQnfSAgICAgICAgICAgICA9ICdXTEFOIEFjY2VzcyBQb2ludCc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1RlbGNvJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgPSAnU3RydW1lbnRpIGRpIEFtbWluaXN0cmF6aW9uZSc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgID0gJ0FwcGxpY2F6aW9uZSBDbGllbnRlJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgPSAnU08gQ2xpZW50ZSc7CiAgICAkTGFuZy0+eydFbWJlZGRlZCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0VtYmVkZGVkJzsKICAgICRMYW5nLT57J01pZGRsZXdhcmUnfSAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FsdHJvJzsKICAgICRMYW5nLT57J1NlcnZlciBBcHBsaWNhdGlvbid9ICAgICAgICAgICAgPSAnQXBsaWNhemlvbmUgU2VydmVyJzsKICAgICRMYW5nLT57J1NlcnZlciBPUyd9ICAgICAgICAgICAgICAgICAgICAgPSAnU08gU2VydmVyJzsKICAgICRMYW5nLT57J1VzZXIgVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgPSAnU3RydW1lbnRpIFV0ZW50ZSc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgID0gJ1V0ZW50aSBjb25jb3JyZW50aSc7CiAgICAkTGFuZy0+eydEZW1vJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RpbW9zdHJhdGl2byc7CiAgICAkTGFuZy0+eydEZXZlbG9wZXIgTGljZW5jZSd9ICAgICAgICAgICAgID0gJ0xpY2VuemEgZGkgU3ZpbHVwcG8nOwogICAgJExhbmctPnsnRW50ZXJwcmlzZSBMaWNlbmNlJ30gICAgICAgICAgICA9ICdMaWNlbnphIEF6aWVuZGFsZSc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0ZyZWV3YXJlJzsKICAgICRMYW5nLT57J09wZW4gU291cmNlJ30gICAgICAgICAgICAgICAgICAgPSAnT3BlbiBTb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgTm9kbyc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgID0gJ1BlciBQcm9jZXNzb3JlJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgPSAnUGVyIFNlcnZlcic7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBVdGVudGUnOwogICAgJExhbmctPnsnU2luZ2xlIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdTaW5nbGUgTGljZW5jZSc7CiAgICAkTGFuZy0+eydUaW1lIFJlc3RyaWN0ZWQnfSAgICAgICAgICAgICAgID0gJ0xpbWl0YXRhIG5lbCB0ZW1wbyc7CiAgICAkTGFuZy0+eydVbmxpbWl0ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ0lsbGltaXRhdGEnOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICA9ICdMaWNlbnphIHBlciBWb2x1bWUnOwogICAgJExhbmctPnsnTW9kZWwnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb2RlbGxvJzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgPSAnTnVtZXJvIFNlcmlhbGUnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICA9ICdTaXN0ZW1hIE9wZXJhdGl2byc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NQVSc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhbSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgID0gJ0Rpc2NvIFJpZ2lkbyc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgID0gJ0Rpc2NvIFJpZ2lkbzo6Q2FwYWNpdOAnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICA9ICdDYXBhY2l04Cc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdBZGF0dGF0b3JlIGRpIFJldGUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSA9ICdBZGF0dGF0b3JlIGRpIFJldGU6OklQIHN1IERIQ1AnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICA9ICdBZGF0dGF0b3JlIGRpIFJldGU6OkluZGlyaXp6byBJUCc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgID0gJ0lQIHN1IERIQ1AnOwogICAgJExhbmctPnsnSVAgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICA9ICdJbmRpcml6em8gSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICA9ICdTY2hlZGEgR3JhZmljYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgID0gJ0FsdHJlIEFwcGFyZWNjaGlhdHVyZSc7CiAgICAkTGFuZy0+eydXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnfSAgICAgID0gJ0RhdGEgZGkgc2NhZGVuemEgZGVsbGEgZ2FyYW56aWEnOwogICAgJExhbmctPnsnSW5zdGFsbCBEYXRlJ30gICAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIGluc3RhbGxhemlvbmUnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzJ30gICAgICAgICAgICAgICA9ICdJbmRpcml6em8gZGkgUmV0ZSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gID0gJ0luZGlyaXp6byBkaSBSZXRlOjpTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OkdhdGV3YXknfSAgICAgID0gJ0luZGlyaXp6byBkaSBSZXRlOjpHYXRld2F5JzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgPSAnU3VibmV0IE1hc2snOwogICAgJExhbmctPnsnR2F0ZXdheSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHYXRld2F5JzsKICAgICRMYW5nLT57J0xpY2VuY2UgVHlwZSd9ICAgICAgICAgICAgICAgICAgPSAnVGlwbyBkaSBMaWNlbnphJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgPSAnQ2hpYXZlIGRlbGxhIExpY2VuemEnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICA9ICdDaGlhdmUgZGVsbGEgTGljZW56YTo6UXVhbnRpdOAnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OkV4cGlyYXRpb24gRGF0ZSd9ICA9ICdDaGlhdmUgZGVsbGEgTGljZW56YTo6RGF0YSBkaSBzY2FkZW56YSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1F1YW50aXTgJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAnRGF0YSBkaSBzY2FkZW56YSc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N1cHBvcnRvJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gPSAnTnVtZXJvIG1hc3NpbW8gZGkgdW4gZWxlbWVudG8nOwogICAgJExhbmctPnsnSWRlbnRpZmllcid9ICAgICAgICAgICAgICAgICAgICA9ICdJZGVudGlmaWNhdGl2byc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBJVFNNQ29uZmlnSXRlbQojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjEgMjAwOS8wNy8yMCAxMzo1ODo0OSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0nfSAgICAgICAgICAgID0gJ0NvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtLUFyZWEnfSAgICAgICA9ICdDb25maWd1cmF0aWUtaXRlbS1nZWJpZWQnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0gTWFuYWdlbWVudCd9ID0gJ0NvbmZpZ3VyYXRpZS1pdGVtIGJlaGVlcic7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnRGVmaW5pdGllIHZlcmFuZGVyZW4nOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ0tsYXNzZSc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnVG9vbiB2ZXJzaWVzJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdWZXJiZXJnIHZlcnNpZXMnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ0xhYXN0ZSB3aWp6aWdpbmcgZG9vcic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnTGFhc3RlIHdpanppZ2luZyc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnRGVmaW5pdGlld2lqemlnaW5nIG1pc2x1a3QhIFppZSBkZSBTeXN0ZW0gTG9nIHZvb3IgZGV0YWlscy4nOwogICAgJExhbmctPnsnQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/J30gPSAnT29rIGluIGVlcmRlcmUgdmVyc2llcyB6b2VrZW4/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ0dldG9vbmRlIGNvbmZpZ3VyYXRpZS1pdGVtcyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgYXZhaWxhYmxlJ30gICAgICAgICAgICA9ICdCZXNjaGlrYmFyZSBjb25maWd1cmF0aWUtaXRlbXMnOwogICAgJExhbmctPnsnRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgICAgICAgICAgPSAnU3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ0FjdHVlbGUgc3RhdHVzJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgID0gJ0luY2lkZW50c3RhdHVzJzsKICAgICRMYW5nLT57J0N1cnJlbnQgSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgID0gJ0FjdHVlbGUgaW5jaWRlbnRzdGF0dXMnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnRGUgbmFhbSB2YW4gZGl0IGNvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ0RlIHN0YXR1cyB2YW4gZGl0IGNvbmZpZ3VyYXRpZS1pdGVtJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnRGUgaW5jaWRlbnRzdGF0dXMgdmFuIGRpdCBjb25maWd1cmF0aWUtaXRlbSc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhYXRzdGUgd2lqemlnaW5nJzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGljZXJlbic7CiAgICAkTGFuZy0+eydFeHBpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZlcmxvcGVuJzsKICAgICRMYW5nLT57J0luYWN0aXZlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5hY3RpZWYnOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbiBvbmRlcmhvdWQnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQaWxvdCc7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dlcGxhbm5lZCc7CiAgICAkTGFuZy0+eydQcm9kdWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2R1a3RpZSc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0luIHJlcGFyYXRpZSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VpdGdlZmFzZWVyZCc7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Jldmlldyc7CiAgICAkTGFuZy0+eydUZXN0L1FBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Rlc3QvUUEnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVyYXRpb25lZWwnOwogICAgJExhbmctPnsnSW5jaWRlbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdJbmNpZGVudCc7CiAgICAkTGFuZy0+eydEZXNrdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMYXB0b3AnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPdmVyaWdlJzsKICAgICRMYW5nLT57J1BEQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsZWZvb24nOwogICAgJExhbmctPnsnU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCYWNrdXBhcHBhcmFhdCc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlYW1lcic7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhbWVyYSc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RvY2tpbmcgc3RhdGlvbic7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RvZXRzZW5ib3JkJzsKICAgICRMYW5nLT57J01vZGVtJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNb25pdG9yJzsKICAgICRMYW5nLT57J01vdXNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTXVpcyc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ092ZXJpZ2UnOwogICAgJExhbmctPnsnUENNQ0lBIENhcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQQ01DSUEga2FhcnQnOwogICAgJExhbmctPnsnUHJpbnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcmludGVyJzsKICAgICRMYW5nLT57J1JvdXRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2Nhbm5lcic7CiAgICAkTGFuZy0+eydTZWN1cml0eSBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlY3VyaXR5IGRldmljZSc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N3aXRjaCc7CiAgICAkTGFuZy0+eydVU0IgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VTQiBhcHBhcmFhdCc7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4gQWNjZXNzIFBvaW50JzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnR1NNJzsKICAgICRMYW5nLT57J0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTEFOJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGNvJzsKICAgICRMYW5nLT57J1dMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV0xBTic7CiAgICAkTGFuZy0+eydBZG1pbiBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkbWluIFRvb2wnOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdDbGllbnR0b2VwYXNzaW5nJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2xpZW50IGJlc3R1cmluZ3NzeXN0ZWVtJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRW1iZWRkZWQnOwogICAgJExhbmctPnsnTWlkZGxld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNaWRkbGV3YXJlJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcnRvZXBhc3NpbmcnOwogICAgJExhbmctPnsnU2VydmVyIE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ2ZXIgYmVzdHVyaW5nc3N5c3RlZW0nOwogICAgJExhbmctPnsnVXNlciBUb29sJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVc2VyIFRvb2wnOwogICAgJExhbmctPnsnQ29uY3VycmVudCBVc2Vycyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdHZWxpamt0aWpkaWdlIGdlYnJ1aWtlcnMnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEZW1vJzsKICAgICRMYW5nLT57J0RldmVsb3BlciBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnT250d2lra2VsYWFyc2xpY2VudGllJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRW50ZXJwcmlzZWxpY2VudGllJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRnJlZXdhcmUnOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPcGVuIFNvdXJjZSc7CiAgICAkTGFuZy0+eydQZXIgTm9kZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBub2RlJzsKICAgICRMYW5nLT57J1BlciBQcm9jZXNzb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUGVyIENQVSc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1BlciBzZXJ2ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQZXIgZ2VicnVpa2VyJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2luZ2xlIExpY2VuY2UnOwogICAgJExhbmctPnsnVGltZSBSZXN0cmljdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdUaW1lIHJlc3RyaWN0ZWQnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPbmdlbGltaXRlZXJkJzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVm9sdW1lIExpY2VudGllJzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJpZW51bW1lcic7CiAgICAkTGFuZy0+eydPcGVyYXRpbmcgU3lzdGVtJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0Jlc3R1cmluZ3NzeXN0ZWVtJzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ1BVJzsKICAgICRMYW5nLT57J1JhbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUkFNJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSGFyZGUgc2NoaWpmJzsKICAgICRMYW5nLT57J0hhcmQgRGlzazo6Q2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgPSAnSGFyZGUgc2NoaWpmOjpDYXBhY2l0ZWl0JzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FwYWNpdGVpdCc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdOZXR3ZXJrIGFkYXB0ZXInOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICdOZXR3ZXJrIGFkYXB0ZXI6OklQIHZpYSBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgPSAnTmV0d2VyayBhZGFwdGVyOjpJUCBhZHJlcyc7CiAgICAkTGFuZy0+eydJUCBvdmVyIERIQ1AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIHZpYSBESENQJzsKICAgICRMYW5nLT57J0lQIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAgYWRyZXMnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWaWRlb2thYXJ0JzsKICAgICRMYW5nLT57J090aGVyIEVxdWlwbWVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3ZlcmlnZSB1aXRydXN0aW5nJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgPSAnRWluZGRhdHVtIGdhcmFudGllJzsKICAgICRMYW5nLT57J0luc3RhbGwgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5zdGFsbGF0aWVkYXR1bSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ05ldHdlcmthZHJlcyc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ05ldHdlcmthZHJlczo6U3VibmV0IE1hc2snOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICdOZXR3ZXJrYWRyZXM6OkdhdGV3YXknOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdWJuZXQgTWFzayc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dhdGV3YXknOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXR5cGUnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXNsZXV0ZWwnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXk6OlF1YW50aXR5J30gICAgICAgICAgICAgICAgICA9ICdMaWNlbnRpZXNsZXV0ZWw6OkhvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAnTGljZW50aWVzbGV1dGVsOjpFeHBpcmF0aWVkYXR1bSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0hvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnRXhwaXJhdGllZGF0dW0nOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWRpYSc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgID0gJ01heGltYWxlIGhvZXZlZWxoZWlkJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSWRlbnRpZmljYXRpZSc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RlbGVmb29uIDEnOwogICAgJExhbmctPnsnUGhvbmUgMid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9vbiAyJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXMnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHZWJvdXcnOwogICAgJExhbmctPnsnRmxvb3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFdGFnZSc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1NlcnZlcnJ1aW10ZSc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thbnRvb3InOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBYW5zbHVpdGluZyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcic7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dlcmtwbGVrJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgSVRTTUNvbmZpZ0l0ZW0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0lUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW0tQXJlYSd9ICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRMYW5nLT57J0NoYW5nZSBEZWZpbml0aW9uJ30gICAgICA9ICcnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTaG93IFZlcnNpb25zJ30gICAgICAgICAgPSAnUG9rYb8gd2Vyc2plJzsKICAgICRMYW5nLT57J0hpZGUgVmVyc2lvbnMnfSAgICAgICAgICA9ICdVa3J5aiB3ZXJzamUnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ09zdGF0bmlvIHptaWVuaW9uZSBwcnpleic7CiAgICAkTGFuZy0+eydMYXN0IGNoYW5nZWQnfSAgICAgICAgICAgPSAnT3N0YXRuaW8gem1pZW5pb25lJzsKICAgICRMYW5nLT57J0NoYW5nZSBvZiBkZWZpbml0aW9uIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0Fsc28gc2VhcmNoIGluIHByZXZpb3VzIHZlcnNpb25zPyd9ICAgICAgICA9ICdVd3pnbOpkbmnmIHBvcHJ6ZWRuaWUgd2Vyc2plPyc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbXMgc2hvd24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBhdmFpbGFibGUnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnU2VhcmNoIENvbmZpZyBJdGVtcyd9ICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3RhbiB3ZHJvv2VuaWEnOwogICAgJExhbmctPnsnQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgID0gJ0FrdHVhbG55IHN0YW4gd2Ryb79lbmlhJzsKICAgICRMYW5nLT57J0luY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTdGFuIHpkYXJ6ZW5pYSc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICAgICAgICAgPSAnQWt0dWFsbnkgc3RhbiB6ZGFyemVuaWEnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gPSAnJzsKICAgICRMYW5nLT57J1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJ30gICA9ICcnOwogICAgJExhbmctPnsnTGFzdCBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ09zdGF0bmlhIHptaWFuYSc7CiAgICAkTGFuZy0+eydEdXBsaWNhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRHVwbGlrYXQnOwogICAgJExhbmctPnsnRXhwaXJlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1d5Z2Fzs28nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05pZWFrdHl3bnknOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaWxvdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1BsYW5uZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFub3dhbnknOwogICAgJExhbmctPnsnUHJvZHVjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1Byb2R1a2NqYSc7CiAgICAkTGFuZy0+eydSZXBhaXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmFwcmF3YSc7CiAgICAkTGFuZy0+eydSZXRpcmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1Jldmlldyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPcGVyYXRpb25hbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0luY2lkZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVza3RvcCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0Rlc2t0b3AnOwogICAgJExhbmctPnsnTGFwdG9wJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xhcHRvcCc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydQREEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUERBJzsKICAgICRMYW5nLT57J1Bob25lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUZWxlZm9uJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXJ3ZXInOwogICAgJExhbmctPnsnQmFja3VwIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1VyerFkemVuaWUgZG8gYmFja3VwdSc7CiAgICAkTGFuZy0+eydCZWFtZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0NhbWVyYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLYW1lcmEnOwogICAgJExhbmctPnsnRG9ja2luZyBTdGF0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N0YWNqYSBkb2t1arFjYSc7CiAgICAkTGFuZy0+eydLZXlib3JkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2xhd2lhdHVyYSc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZW0nOwogICAgJExhbmctPnsnTW9uaXRvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vbml0b3InOwogICAgJExhbmctPnsnTW91c2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ015c3prYSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydQQ01DSUEgQ2FyZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnS2FydGEgUENNQ0lBJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEcnVrYXJrYSc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUm91dGVyJzsKICAgICRMYW5nLT57J1NjYW5uZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTa2FuZXInOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3dpdGNoJzsKICAgICRMYW5nLT57J1VTQiBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVcnqxZHplbmllIFVTQic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWNjZXNzIFBvaW50JzsKICAgICRMYW5nLT57J0dTTSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdHU00nOwogICAgJExhbmctPnsnTEFOJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xBTic7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydUZWxjbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGVsY28nOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4nOwogICAgJExhbmctPnsnQWRtaW4gVG9vbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hcnrqZHppZSBhZG1pbmlzdHJhdG9yc2tpZSc7CiAgICAkTGFuZy0+eydDbGllbnQgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQXBsaWthY2phIGtsaWVuY2thJzsKICAgICRMYW5nLT57J0NsaWVudCBPUyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTeXN0ZW0ga2xpZW5ja2knOwogICAgJExhbmctPnsnRW1iZWRkZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlkZGxld2FyZSc7CiAgICAkTGFuZy0+eydPdGhlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSW5uZSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgQXBwbGljYXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQXBsaWthY2phIHNlcndlcm93YSc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU3lzdGVtIHNlcndlcm93eSc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmFyeupkemllIHW/eXRrb3duaWthJzsKICAgICRMYW5nLT57J0NvbmN1cnJlbnQgVXNlcnMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnRGVtbyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RlbW8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0xpY2VuY2phIGRldmVsb3BlcnNrYSc7CiAgICAkTGFuZy0+eydFbnRlcnByaXNlIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0ZyZWV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdGcmVld2FyZSc7CiAgICAkTGFuZy0+eydPcGVuIFNvdXJjZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3BlbiBzb3VyY2UnOwogICAgJExhbmctPnsnUGVyIE5vZGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHVyerFkemVuaWUnOwogICAgJExhbmctPnsnUGVyIFByb2Nlc3Nvcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHByb2Nlc29yJzsKICAgICRMYW5nLT57J1BlciBTZXJ2ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdOYSBzZXJ3ZXInOwogICAgJExhbmctPnsnUGVyIFVzZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hIHW/eXRrb3duaWthJzsKICAgICRMYW5nLT57J1NpbmdsZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2plZHnxY3phIGxpY2VuY2phJzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDemFzb3dvIG9ncmFuaWN6b25hJzsKICAgICRMYW5nLT57J1VubGltaXRlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZXogbGltaXR1JzsKICAgICRMYW5nLT57J1ZvbHVtZSBMaWNlbmNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdaYmlvcmN6YSBsaWNlbmNqYSc7CiAgICAkTGFuZy0+eydNb2RlbCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTW9kZWwnOwogICAgJExhbmctPnsnU2VyaWFsIE51bWJlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ051bWVyIHNlcnlqbnknOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1N5c3RlbSBvcGVyYWN5am55JzsKICAgICRMYW5nLT57J0NQVSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQcm9jZXNvcic7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUkFNJzsKICAgICRMYW5nLT57J0hhcmQgRGlzayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEeXNrIHR3YXJkeSc7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgPSAnUG9qZW1ub7bmIGR5c2t1IHR3YXJkZWdvJzsKICAgICRMYW5nLT57J0NhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQb2plbW5vtuYnOwogICAgJExhbmctPnsnRlFETid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05hendhIEZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcnRhIHNpZWNpb3dhJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgb3ZlciBESENQJ30gICAgICAgICAgICA9ICdLYXJ0YSBzaWVjaW93YTo6QWRyZXMgSVAgeiBESENQJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRhcHRlcjo6SVAgQWRkcmVzcyd9ICAgICAgICAgICAgICA9ICdLYXJ0YSBzaWVjaW93YTo6QWRyZXMgSVAnOwogICAgJExhbmctPnsnSVAgb3ZlciBESENQJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkcmVzIElQIHogREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWRyZXMgSVAnOwogICAgJExhbmctPnsnR3JhcGhpYyBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0thcnRhIGdyYWZpY3puYSc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUG96b3N0YbNlIHd5cG9zYb9lbmllJzsKICAgICRMYW5nLT57J1dhcnJhbnR5IEV4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICA9ICdEYXRhIHd5Z2G2bmnqY2lhIGd3YXJhbmNqaSc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBpbnN0YWxhY2ppJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZHJlcyBzaWVjaW93eSc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgPSAnQWRyZXMgc2llY2lvd3k6Ok1hc2thIHNpZWNpJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzczo6R2F0ZXdheSd9ICAgICAgICAgICAgICAgICA9ICdBZHJlcyBzaWVjaW93eTo6QnJhbWEnOwogICAgJExhbmctPnsnU3VibmV0IE1hc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ01hc2thIHNpZWNpJzsKICAgICRMYW5nLT57J0dhdGV3YXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCcmFtYSc7CiAgICAkTGFuZy0+eydMaWNlbmNlIFR5cGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVHlwIGxpY2Vuc2ppJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdLbHVjeiBsaWNlbmN5am55JzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICA9ICdLbHVjeiBsaWNlbmN5am55OjpJbG+25ic7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6RXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgPSAnS2x1Y3ogbGljZW5jeWpueTo6RGF0YSB3eWdhtm5p6mNpYSc7CiAgICAkTGFuZy0+eydRdWFudGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSWxvtuYnOwogICAgJExhbmctPnsnRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGEgd3lnYbZuaepjaWEnOwogICAgJExhbmctPnsnTWVkaWEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ05vtm5payc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCd9ICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUGhvbmUgMSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0lUIEZhY2lsaXR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNQ29uZmlnSXRlbS5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0lUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDcvMjAgMTM6MTE6MTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtJ30gICAgICAgICAgICA9ICfO8e3u4u375SDx8OXk8fLi4Cc7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbS1BcmVhJ30gICAgICAgPSAnzuHn7vAg7vHt7uLt+/Ug8fDl5PHy4ic7CiAgICAkTGFuZy0+eydDb25maWcgSXRlbSBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDu8e3u4u377Ogg8fDl5PHy4uDs6Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgRGVmaW5pdGlvbid9ICAgICAgPSAnyOfs5e3o8vwg7u/o8eDt6OUnOwogICAgJExhbmctPnsnQ2xhc3MnfSAgICAgICAgICAgICAgICAgID0gJ8rr4PHxJzsKICAgICRMYW5nLT57J1Nob3cgVmVyc2lvbnMnfSAgICAgICAgICA9ICfP7urg5+Dy/CDi5fDx6OgnOwogICAgJExhbmctPnsnSGlkZSBWZXJzaW9ucyd9ICAgICAgICAgID0gJ9Hq8Pvy/CDi5fDx6OgnOwogICAgJExhbmctPnsnTGFzdCBjaGFuZ2VkIGJ5J30gICAgICAgID0gJ8Di8u7wIO/u8evl5O3l4+4g6Ofs5e3l7ej/JzsKICAgICRMYW5nLT57J0xhc3QgY2hhbmdlZCd9ICAgICAgICAgICA9ICfC8OXs/yDv7vHr5eTt5ePuIOjn7OXt5e3o/yc7CiAgICAkTGFuZy0+eydDaGFuZ2Ugb2YgZGVmaW5pdGlvbiBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9CiAgICAgICAgPSAnzeXi7ufs7ubt7iDo5+zl7ejy/CDu7+jx4O3o5SEgxOv/IO/u5PDu4e3u6SDo7fTu8Ozg9ujoIPHs7vLw6CBTeXN0ZW0gTG9nLic7CiAgICAkTGFuZy0+eydBbHNvIHNlYXJjaCBpbiBwcmV2aW91cyB2ZXJzaW9ucz8nfSA9ICfI8erg8vwg4iDv8OXk++Tz+ej1IOLl8PHo//U/JzsKICAgICRMYW5nLT57J0NvbmZpZyBJdGVtcyBzaG93bid9ICAgICAgICAgICAgICAgID0gJ8/u6uDn4O3uIO7x7e7i7fv1IPHw5eTx8uInOwogICAgJExhbmctPnsnQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSd9ICAgICAgICAgICAgPSAnxO7x8vPv7e4g7vHt7uLt+/Ug8fDl5PHy4ic7CiAgICAkTGFuZy0+eydTZWFyY2ggQ29uZmlnIEl0ZW1zJ30gICAgICAgICAgICAgICA9ICfP7ujx6iDu8e3u4u379SDx8OXk8fLiJzsKICAgICRMYW5nLT57J0RlcGxveW1lbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgID0gJ9Hu8fLu/+3o5SDo8e/u6/zn7uLg7ej/JzsKICAgICRMYW5nLT57J0N1cnJlbnQgRGVwbG95bWVudCBTdGF0ZSd9ICAgICAgICAgID0gJ9Ll6vP55eUg8e7x8u7/7ejlIOjx7+7r/Ofu4uDt6P8nOwogICAgJExhbmctPnsnSW5jaWRlbnQgU3RhdGUnfSAgICAgICAgICAgICAgICAgICAgPSAn0e7x8u7/7ejlIOjt9ujk5e3y4Cc7CiAgICAkTGFuZy0+eydDdXJyZW50IEluY2lkZW50IFN0YXRlJ30gICAgICAgICAgICA9ICfS5erz+eXlIPHu8fLu/+3o5SDo7fbo5OXt8uAnOwogICAgJExhbmctPnsnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSd9ICAgICAgPSAnyOz/IP3y7uPuIPP35fLt7uPuIP3r5ezl7fLgJzsKICAgICRMYW5nLT57J1RoZSBkZXBsb3ltZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nfQogICAgICAgID0gJ9Hu8fLu/+3o5SDo8e/u6/zn7uLg7ej/IP3y7uPuIO7x7e7i7e7j7iDx8OXk8fLi4Cc7CiAgICAkTGFuZy0+eydUaGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSd9ID0gJ9Hy4PLz8Sc7CiAgICAkTGFuZy0+eydMYXN0IENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Lw5ez/IO/u8evl5O3l4+4g6Ofs5e3l7ej/JzsKICAgICRMYW5nLT57J0R1cGxpY2F0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0OXn5fDiJzsKICAgICRMYW5nLT57J0V4cGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0/Hy4PDl6+4nOwogICAgJExhbmctPnsnSW5hY3RpdmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfN5eDq8uji7e4nOwogICAgJExhbmctPnsnTWFpbnRlbmFuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5fXt6Pfl8eru5SDu4fHr8+bo4uDt6OUnOwogICAgJExhbmctPnsnUGlsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfd6vHv5fDo7OXt8ic7CiAgICAkTGFuZy0+eydQbGFubmVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8fg7+vg7ejw7uLg7e3uJzsKICAgICRMYW5nLT57J1Byb2R1Y3Rpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Du6Ofi7uTx8uLuJzsKICAgICRMYW5nLT57J1JlcGFpcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0OXs7u3yJzsKICAgICRMYW5nLT57J1JldGlyZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0e/o8eDt7ic7CiAgICAkTGFuZy0+eydSZXZpZXcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ93q8e/l8PLo5+AnOwogICAgJExhbmctPnsnVGVzdC9RQSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5fHy6PDu4uDt6OUnOwogICAgJExhbmctPnsnT3BlcmF0aW9uYWwnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfCIP3q8e/r8+Dy4Pbo6Cc7CiAgICAkTGFuZy0+eydJbmNpZGVudCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8jt9ujk5e3yJzsKICAgICRMYW5nLT57J0Rlc2t0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzeDx8u7r/O376SDPyic7CiAgICAkTGFuZy0+eydMYXB0b3AnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83u8/Lh8+onOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnUERBJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQREEnOwogICAgJExhbmctPnsnUGhvbmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS5evl9O7tJzsKICAgICRMYW5nLT57J1NlcnZlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXw4uXwJzsKICAgICRMYW5nLT57J0JhY2t1cCBEZXZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0/Hy8O7p8fLi7iDh/erg7+AnOwogICAgJExhbmctPnsnQmVhbWVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfP8O7l6vLu8Cc7CiAgICAkTGFuZy0+eydDYW1lcmEnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8rg7OXw4Cc7CiAgICAkTGFuZy0+eydEb2NraW5nIFN0YXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tu6i3x8uDt9uj/JzsKICAgICRMYW5nLT57J0tleWJvcmQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyuvg4ujg8vPw4Cc7CiAgICAkTGFuZy0+eydNb2RlbSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zu5OXsJzsKICAgICRMYW5nLT57J01vbml0b3InfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7t6PLu8Cc7CiAgICAkTGFuZy0+eydNb3VzZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8z7+OrgJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxPDz4+7lJzsKICAgICRMYW5nLT57J1BDTUNJQSBDYXJkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnUENNQ0lBIOrg8PLgJzsKICAgICRMYW5nLT57J1ByaW50ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Do7fLl8Cc7CiAgICAkTGFuZy0+eydSb3V0ZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zg8Pjw8/Lo5+Dy7vAnOwogICAgJExhbmctPnsnU2Nhbm5lcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfR6uDt5fAnOwogICAgJExhbmctPnsnU2VjdXJpdHkgRGV2aWNlJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR7ODw8i3q4PDy4Cc7CiAgICAkTGFuZy0+eydTd2l0Y2gnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8ru7Ozz8uDy7vAnOwogICAgJExhbmctPnsnVVNCIERldmljZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdVU0Ig8/Hy8O7p8fLi7ic7CiAgICAkTGFuZy0+eydXTEFOIEFjY2VzcyBQb2ludCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1dMQU4g8u736uAg5O7x8vPv4Cc7CiAgICAkTGFuZy0+eydHU00nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0dTTSc7CiAgICAkTGFuZy0+eydMQU4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8uXi4P8g6uDw8uAnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnVGVsY28nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnV0xBTid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXTEFOJzsKICAgICRMYW5nLT57J0FkbWluIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0ejx8uXs7fvlIPPy6Ovo8vsnOwogICAgJExhbmctPnsnQ2xpZW50IEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6u7lIO/w6Ovu5uXt6OUnOwogICAgJExhbmctPnsnQ2xpZW50IE9TJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK6+jl7fLx6uD/IM7RJzsKICAgICRMYW5nLT57J0VtYmVkZGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnwvHy8O7l7e376Sc7CiAgICAkTGFuZy0+eydNaWRkbGV3YXJlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/w7uzl5vPy7vft7uUgz84nOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfE8PPj7uUnOwogICAgJExhbmctPnsnU2VydmVyIEFwcGxpY2F0aW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfR5fDi5fDt7uUg7/Do6+7m5e3o5Sc7CiAgICAkTGFuZy0+eydTZXJ2ZXIgT1MnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9Hl8OLl8O3g/yDO0Sc7CiAgICAkTGFuZy0+eydVc2VyIFRvb2wnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8/u6/zn7uLg8uXr/PHq6OUg8/Lo6+jy+yc7CiAgICAkTGFuZy0+eydDb25jdXJyZW50IFVzZXJzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8ru7erz8OXt8uD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J0RlbW8nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnxOXs7i3i5fDx6P8nOwogICAgJExhbmctPnsnRGV2ZWxvcGVyIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo/yDk6/8g8ODn8ODh7vL36OrgJzsKICAgICRMYW5nLT57J0VudGVycHJpc2UgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnyu7w7+7w4PLo4u3g/yDr6Pbl7efo/yc7CiAgICAkTGFuZy0+eydGcmVld2FyZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Hl8e/r4PLt7uUgz84nOwogICAgJExhbmctPnsnT3BlbiBTb3VyY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfPziDxIO7y6vD78vvsIOru5O7sJzsKICAgICRMYW5nLT57J1BlciBOb2RlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzeAg7e7k8yjz5+XrKSc7CiAgICAkTGFuZy0+eydQZXIgUHJvY2Vzc29yJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gINbP0yc7CiAgICAkTGFuZy0+eydQZXIgU2VydmVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gIPHl8OLl8Cc7CiAgICAkTGFuZy0+eydQZXIgVXNlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ83gIO/u6/zn7uLg8uXr/yc7CiAgICAkTGFuZy0+eydTaW5nbGUgTGljZW5jZSd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87k7e7q8ODy7eD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J1RpbWUgUmVzdHJpY3RlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnzuPw4O3o9+Xt7eD/IO/uIOLw5ezl7egnOwogICAgJExhbmctPnsnVW5saW1pdGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfB5ecg7uPw4O3o9+Xt6OknOwogICAgJExhbmctPnsnVm9sdW1lIExpY2VuY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7vDv7vDg8uji7eD/IOvo9uXt5+j/JzsKICAgICRMYW5nLT57J01vZGVsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzO7k5ev8JzsKICAgICRMYW5nLT57J1NlcmlhbCBOdW1iZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXw6Ont++kg7e7s5fAnOwogICAgJExhbmctPnsnT3BlcmF0aW5nIFN5c3RlbSd9ICAgICAgICAgICAgICAgICAgICAgICA9ICfO7+Xw4Pbo7u3t4P8g8ejx8uXs4Cc7CiAgICAkTGFuZy0+eydDUFUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9bP0yc7CiAgICAkTGFuZy0+eydSYW0nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ87H0yc7CiAgICAkTGFuZy0+eydIYXJkIERpc2snfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8bl8fLq6Okg5Ojx6ic7CiAgICAkTGFuZy0+eydIYXJkIERpc2s6OkNhcGFjaXR5J30gICAgICAgICAgICAgICAgICAgID0gJ8bl8fLq6Okg5Ojx6jo6zuH65ewnOwogICAgJExhbmctPnsnQ2FwYWNpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfO4frl7Cc7CiAgICAkTGFuZy0+eydGUUROJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0ZRRE4nOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fAnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBvdmVyIERIQ1AnfSAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fA6OklQIO/uIERIQ1AnOwogICAgJExhbmctPnsnTmV0d29yayBBZGFwdGVyOjpJUCBBZGRyZXNzJ30gICAgICAgICAgICA9ICfR5fLl4u7pIODk4O/y5fA6OklQIODk8OXxJzsKICAgICRMYW5nLT57J0lQIG92ZXIgREhDUCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnSVAg7+4gREhDUCc7CiAgICAkTGFuZy0+eydJUCBBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0lQIODk8OXxJzsKICAgICRMYW5nLT57J0dyYXBoaWMgQWRhcHRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnwujk5e4g4OTg7/Ll8Cc7CiAgICAkTGFuZy0+eydPdGhlciBFcXVpcG1lbnQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tw8+Pu5SDu4e7w8+Tu4uDt6OUnOwogICAgJExhbmctPnsnV2FycmFudHkgRXhwaXJhdGlvbiBEYXRlJ30gICAgICAgICAgICAgICA9ICfR8O7qIOjx8uX35e3o/yDj4PDg7fLo6Cc7CiAgICAkTGFuZy0+eydJbnN0YWxsIERhdGUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8Tg8uAg8/Hy4O3u4uroJzsKICAgICRMYW5nLT57J05ldHdvcmsgQWRkcmVzcyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn0eXy5eLu6SDg5PDl8Sc7CiAgICAkTGFuZy0+eydOZXR3b3JrIEFkZHJlc3M6OlN1Ym5ldCBNYXNrJ30gICAgICAgICAgID0gJ9Hl8uXi7ukg4OTw5fE6Oszg8ergIO/u5PHl8ugnOwogICAgJExhbmctPnsnTmV0d29yayBBZGRyZXNzOjpHYXRld2F5J30gICAgICAgICAgICAgICA9ICfR5fLl4u7pIODk8OXxOjrY6/7nJzsKICAgICRMYW5nLT57J1N1Ym5ldCBNYXNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnzODx6uAg7+7k8eXy6Cc7CiAgICAkTGFuZy0+eydHYXRld2F5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9jr/ucnOwogICAgJExhbmctPnsnTGljZW5jZSBUeXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfS6O8g6+j25e3n6OgnOwogICAgJExhbmctPnsnTGljZW5jZSBLZXknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfL6Pbl7efo7u3t++kg6uv+9yc7CiAgICAkTGFuZy0+eydMaWNlbmNlIEtleTo6UXVhbnRpdHknfSAgICAgICAgICAgICAgICAgID0gJ8vo9uXt5+ju7e376SDq6/73OjrK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0xpY2VuY2UgS2V5OjpFeHBpcmF0aW9uIERhdGUnfSAgICAgICAgICAgPSAny+j25e3n6O7t7fvpIOrr/vc6OtHw7uog6+j25e3n6OgnOwogICAgJExhbmctPnsnUXVhbnRpdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICfK7uvo9+Xx8uLuJzsKICAgICRMYW5nLT57J0V4cGlyYXRpb24gRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAn0fDu6iDr6Pbl7efo6Cc7CiAgICAkTGFuZy0+eydNZWRpYSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ8zz6/zy6Ozl5Ojp7fvlIPHw5eTx8uLgJzsKICAgICRMYW5nLT57J01heGltdW0gbnVtYmVyIG9mIG9uZSBlbGVtZW50J30gICAgICAgICAgPSAnzODq8ejs4Ov87e7lIOru6+j35fHy4u4g7uTt7uPuIP3r5ezl7fLgJzsKICAgICRMYW5nLT57J0lkZW50aWZpZXInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnyOTl7fLo9Ojq4PLu8Cc7CiAgICAkTGFuZy0+eydQaG9uZSAxJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydQaG9uZSAyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPZmZpY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhZG1pbiBmcm9udGVuZCB0byBtYW5hZ2UgY29uZmlnIGl0ZW1zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Db25maWdJdGVtLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISRDbGFzc0xpc3Q7CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCkgaWYgISV7JENsYXNzTGlzdH07CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWZpbml0aW9uIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uTGlzdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvbkxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkZWZpbml0aW9uIGxpc3QKICAgICAgICBteSAkRGVmaW5pdGlvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJERlZmluaXRpb24gKCByZXZlcnNlIEB7JERlZmluaXRpb25MaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZGVmaW5pdGlvbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvbkxpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiB2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVmaW5pdGlvblZpZXcnICkgewoKICAgICAgICAjIGdldCBkZWZpbml0aW9uIGlkCiAgICAgICAgbXkgJERlZmluaXRpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlZmluaXRpb25JRCcgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkRGVmaW5pdGlvbklEOwoKICAgICAgICAjIGdldCBkZWZpbml0aW9uCiAgICAgICAgbXkgJERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb25JRCwKICAgICAgICApOwogICAgICAgICREZWZpbml0aW9uLT57RGVmaW5pdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICREZWZpbml0aW9uLT57RGVmaW5pdGlvbn0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZWZpbml0aW9uLT57Q2xhc3NJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkRGVmaW5pdGlvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVmaW5pdGlvblZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVmaW5pdGlvbiBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWZpbml0aW9uQ2hhbmdlJyApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgaWQKICAgICAgICBteSAkQ2xhc3NJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKSBpZiAhJENsYXNzSUQ7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlZmluaXRpb24KICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlZmluaXRpb25DaGFuZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JERlZmluaXRpb259LAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlZmluaXRpb24gc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlZmluaXRpb25TYXZlJyApIHsKICAgICAgICBteSAlRGVmaW5pdGlvbjsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KENsYXNzSUQgRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgJERlZmluaXRpb257JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KENsYXNzSUQgRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgaWYgKCAhJERlZmluaXRpb257JEZvcm1QYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkRm9ybVBhcmFtISIgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgdG8gZGF0YWJhc2UKICAgICAgICBteSAkRGVmaW5pdGlvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkFkZCgKICAgICAgICAgICAgJURlZmluaXRpb24sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKSBpZiAhJERlZmluaXRpb25JRDsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBjbGFzcyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgZ2VuZXJhdGUgQ2xhc3NPcHRpb25TdHJnCiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgJENsYXNzTGlzdC0+eyRhfSBjbXAgJENsYXNzTGlzdC0+eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW0ucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjUgMjAwOS8wNS8xOCAwOTo1NzowNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYWdlCiAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BhZ2UnICkgfHwgMTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgb3V0cHV0IG1lbnUKICAgIG15ICVDbGFzc0NvdW50OwogICAgbXkgJENvdW50ZXIgPSAwOwogICAgZm9yIG15ICRDbGFzc0lEICggc29ydCB7ICR7JENsYXNzTGlzdH17JGF9IGNtcCAkeyRDbGFzc0xpc3R9eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgIyBjb3VudCBhbGwgcmVjb3JkcyBvZiB0aGlzIGNsYXNzCiAgICAgICAgJENsYXNzQ291bnR7JENsYXNzSUR9ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUNvdW50KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbWVudSBpdGVtIHNwbGl0CiAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0sCiAgICAgICAgICAgICAgICBDb3VudCAgID0+ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgaWQKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICBteSAlU2VhcmNoUmVzdWx0ID0gKAogICAgICAgIFJlc3VsdCAgICAgICAgICAgPT4gMCwKICAgICAgICBDb25maWdJdGVtc0F2YWlsID0+IDAsCiAgICApOwoKICAgIGlmICgkQ2xhc3NJRCkgewoKICAgICAgICAjIG91dHB1dCBjbGFzcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3NMaXN0LT57JENsYXNzSUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSA9ICRDbGFzc0NvdW50eyRDbGFzc0lEfSB8fCAwOwoKICAgICAgICBteSAkU2VhcmNoU3RhcnQgPSAwOwogICAgICAgIGlmICggJFBhZ2UgJiYgJFBhZ2UgPiAxICkgewogICAgICAgICAgICAkU2VhcmNoU3RhcnQgPSAoICRQYWdlIC0gMSApICogMTAwOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gbGlzdAogICAgICAgIG15ICRDb25maWdJdGVtUmVzdWx0TGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1SZXN1bHRMaXN0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBTdGFydCAgID0+ICRTZWFyY2hTdGFydCwKICAgICAgICAgICAgTGltaXQgICA9PiAxMDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc2VhcmNoIHJlc3VsdAogICAgICAgICRTZWFyY2hSZXN1bHR7UmVzdWx0fSA9IEB7JENvbmZpZ0l0ZW1SZXN1bHRMaXN0fTsKICAgICAgICAkU2VhcmNoUmVzdWx0e1BhZ2V9ICAgPSBpbnQoICRTZWFyY2hSZXN1bHR7Q29uZmlnSXRlbXNBdmFpbH0gLyAxMDAgKTsKICAgICAgICBpZiAoICggJFNlYXJjaFJlc3VsdHtDb25maWdJdGVtc0F2YWlsfSAvIDEwMCApIC0gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlfSsrOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtICggQHskQ29uZmlnSXRlbVJlc3VsdExpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScgPyAnc2VhcmNoYWN0aXZlJyA6ICdzZWFyY2hwYXNzaXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDbGFzc1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IHBhZ2UKICAgIGlmICggJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKICAgICAgICBmb3IgbXkgJFBhZ2VDb3VudCAoIDEgLi4gJFNlYXJjaFJlc3VsdHtQYWdlfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHBhZ2UgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFRlbXBsYXRlTmFtZSA9ICRQYWdlQ291bnQgZXEgJFBhZ2UgPyAnUGFnZUJvbGQnIDogJ1BhZ2VOb3JtYWwnOwoKICAgICAgICAgICAgIyBvdXRwdXQgcGFnZSBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRUZW1wbGF0ZU5hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgIFBhZ2UgICAgPT4gJFBhZ2VDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdHtQYWdlTnVsbH0gPSAwOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlICAgPT4gJ092ZXJ2aWV3JywKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZWFyY2hSZXN1bHQsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1BZGQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyByZWRpcmVjdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZWRpcmVjdCcgKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGlkCiAgICAgICAgbXkgJENsYXNzSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICkgaWYgISRDbGFzc0lEOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtRWRpdCZDbGFzc0lEPSRDbGFzc0lEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnQWRkJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtQWRkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnBtLHYgMS40IDIwMDkvMDkvMDMgMTM6NTE6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtRWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZ2l0ZW0gaWQgYW5kIGNsYXNzIGlkCiAgICBteSAkQ29uZmlnSXRlbSA9IHt9OwogICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApIHx8IDA7CiAgICAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9ICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApICAgICAgfHwgMDsKICAgIG15ICREdXBsaWNhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0R1cGxpY2F0ZUlEJyApIHx8IDA7CgogICAgIyBnZXQgbmVlZGVkIGRhdGEKICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICYmICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0KICAgICAgICAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkRHVwbGljYXRlSUQpIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gdG8gZHVwbGljYXRlCiAgICAgICAgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IGNvbmZpZyBpdGVtIGlkIGFuZCBudW1iZXIKICAgICAgICAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gPSAnTkVXJzsKICAgICAgICAkQ29uZmlnSXRlbS0+e051bWJlcn0gICAgICAgPSAnTkVXJzsKICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9ICdORVcnOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwogICAgICAgICRDb25maWdJdGVtLT57Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ29uZmlnSXRlbUlELCBEdXBsaWNhdGVJRCBvciBDbGFzc0lEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICk7CgogICAgIyBhYm9ydCwgaWYgbm8gZGVmaW5pdGlvbiBpcyBkZWZpbmVkCiAgICBpZiAoICEkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIERlZmluaXRpb24gd2FzIGRlZmluaWVkIGZvciBjbGFzcyAkQ29uZmlnSXRlbS0+e0NsYXNzfSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHN1Ym1pdCBzYXZlCiAgICBteSAkU3VibWl0U2F2ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdFNhdmUnICk7CgogICAgIyBnZXQgeG1sIGRhdGEKICAgIG15ICRWZXJzaW9uID0ge307CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgIG15ICRBbGxSZXF1aXJlZCA9IDE7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgZm9ybSBkYXRhCiAgICAgICAgZm9yIG15ICRGb3JtUGFyYW0gKHF3KE5hbWUgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQpKSB7CiAgICAgICAgICAgICRWZXJzaW9uLT57JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKTsKICAgICAgICAgICAgaWYgKCAhJFZlcnNpb24tPnskRm9ybVBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHhtbCBmb3JtIGRhdGEKICAgICAgICAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdID0gJFNlbGYtPl9YTUxGb3JtR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgIEFsbFJlcXVpcmVkICAgPT4gXCRBbGxSZXF1aXJlZCwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdmVyc2lvbiB0byBkYXRhYmFzZQogICAgICAgIGlmICggJFN1Ym1pdFNhdmUgJiYgJEFsbFJlcXVpcmVkICkgewogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdmVyc2lvbgogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJWZXJzaW9uSUQiICk7CiAgICAgICAgaWYgKCRWZXJzaW9uSUQpIHsKCiAgICAgICAgICAgICMgZ2V0IHZlcnNpb24gZGF0YSB0byBkdXBsaWNhdGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEgdG8gZHVwbGljYXRlIGNvbmZpZyBpdGVtCiAgICAgICAgICAgICRWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICAgICAgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVhNTEZvcm1PdXRwdXRQYXJhbTsKICAgIGlmICggJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSApIHsKICAgICAgICAkWE1MRm9ybU91dHB1dFBhcmFte1hNTERhdGF9ID0gJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXTsKICAgIH0KCiAgICAjIG91dHB1dCBuYW1lIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd05hbWUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBuYW1lIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57TmFtZX0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnUm93TmFtZUludmFsaWQnICk7CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBEZXBsU3RhdGVPcHRpb25TdHJnCiAgICBteSAkRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVwbFN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3dEZXBsU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBEZXBsU3RhdGVPcHRpb25TdHJnID0+ICREZXBsU3RhdGVPcHRpb25TdHJnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGRlcGxveW1lbnQgc3RhdGUgaW52YWxpZCBibG9jawogICAgaWYgKCAhJFZlcnNpb24tPntEZXBsU3RhdGVJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdWZXJzaW9uU2F2ZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93RGVwbFN0YXRlSW52YWxpZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdvcGVyYXRpb25hbCcsICdpbmNpZGVudCcgXSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBJbmNpU3RhdGVPcHRpb25TdHJnCiAgICBteSAkSW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUm93SW5jaVN0YXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkSW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBkZXBsb3ltZW50IHN0YXRlIGludmFsaWQgYmxvY2sKICAgIGlmICggISRWZXJzaW9uLT57SW5jaVN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmVyc2lvblNhdmUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Jvd0luY2lTdGF0ZUludmFsaWQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgeG1sIGZvcm0KICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAkU2VsZi0+X1hNTEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgJVhNTEZvcm1PdXRwdXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxGb3JtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17QWxsUmVxdWlyZWR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0FsbFJlcXVpcmVkfSBuZSAnU0NBTEFSJzsKCiAgICBteSAkRm9ybURhdGEgPSB7fTsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgbXkgJENvdW50ZXJJbnNlcnQgPSAxOwoKICAgICAgICBDT1VOVEVSOgogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgbXkgJEFkZEtleSAgID0gJEl0ZW0tPntLZXl9IC4gJzo6QWRkJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgICAgICRBZGRLZXkgICA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRBZGRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHBhcmFtCiAgICAgICAgICAgIG15ICRGb3JtVmFsdWVzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbUZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgS2V5ICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRGb3JtVmFsdWVzLT57VmFsdWV9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgdmFsdWUKICAgICAgICAgICAgICAgIGlmICggJEZvcm1WYWx1ZXMtPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICAgICAkeyAkUGFyYW17QWxsUmVxdWlyZWR9IH0gPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGVsZXRlIGJ1dHRvbgogICAgICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJElucHV0S2V5IC4gJzo6RGVsZXRlJyApOwoKICAgICAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWJGb3JtRGF0YSA9ICRTZWxmLT5fWE1MRm9ybUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICBBbGxSZXF1aXJlZCAgID0+ICRQYXJhbXtBbGxSZXF1aXJlZH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0gPSAkU3ViRm9ybURhdGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICRGb3JtVmFsdWVzLT57VmFsdWV9OwogICAgICAgICAgICAgICAgJENvdW50ZXJJbnNlcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGFkZCBidXR0b24KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkQWRkS2V5ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb3JtRGF0YS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVySW5zZXJ0XSA9ICRTZWxmLT5fWE1MRGVmYXVsdFNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCnN1YiBfWE1MRGVmYXVsdFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgbXkgJERlZmF1bHREYXRhID0ge307CgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50RGVmYXVsdH0gKSB7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJERlZmF1bHREYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdID0gJFNlbGYtPl9YTUxEZWZhdWx0U2V0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGVmYXVsdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERlZmF1bHREYXRhOwp9CgpzdWIgX1hNTEZvcm1PdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgIyBzZXQgZGF0YSBwcmVzZW50IG1vZGUKICAgIG15ICREYXRhUHJlc2VudE1vZGUgPSAwOwogICAgaWYgKCAkUGFyYW17WE1MRGF0YX0gJiYgcmVmICRQYXJhbXtYTUxEYXRhfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJERhdGFQcmVzZW50TW9kZSA9IDE7CiAgICB9CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIG91dHB1dCByb3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdYTUxSb3cnICk7CgogICAgICAgICMgc2V0IGxvb3AKICAgICAgICBteSAkTG9vcCA9ICRJdGVtLT57Q291bnREZWZhdWx0fTsKICAgICAgICBpZiAoJERhdGFQcmVzZW50TW9kZSkgewogICAgICAgICAgICAkTG9vcCA9IDA7CgogICAgICAgICAgICAjIHNlYXJjaCB0aGUgbGFzdCBjb250ZW50CiAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAkTG9vcCA9ICRDb3VudGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBhYnNvbHV0IG1pbmltdW0KICAgICAgICAgICAgaWYgKCAkTG9vcCA8ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAgICAgJExvb3AgPSAkSXRlbS0+e0NvdW50TWlufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVsZXRlCiAgICAgICAgbXkgJERlbGV0ZSA9IDA7CiAgICAgICAgaWYgKCAkTG9vcCA+ICRJdGVtLT57Q291bnRNaW59ICkgewogICAgICAgICAgICAkRGVsZXRlID0gMTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGNvbnRlbnQgcm93cwogICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJExvb3AgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBpbnB1dGtleSBhbmQgYWRka2V5CiAgICAgICAgICAgIG15ICRJbnB1dEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlJyApOwoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGNvbnRlbnQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiAgICAgPT4gNCAtICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJpbmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGJsdWUgcmVxdWlyZWQgc3RhcgogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93VmFsdWVDb250ZW50UmVxdWlyZWQnICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJlZCBpbnZhbGlkIHN0YXIKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57JElucHV0S2V5fS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93VmFsdWVDb250ZW50SW52YWxpZCcgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHZhbHVlIGNvbnRlbnQgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudFNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBkZWxldGUgYnV0dG9uCiAgICAgICAgICAgIGlmICgkRGVsZXRlKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudERlbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0S2V5ID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlQ29udGVudERlbGV0ZUR1bW15JyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCByb3cgcnVsZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93VmFsdWVSdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHNwYW4gPT4gNiAtICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHJ1bGUgc3BhY2UsIGlmIGxldmVsIHdhcyBnaXZlbgogICAgICAgICAgICBpZiAoICRQYXJhbXtMZXZlbH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1hNTFJvd1ZhbHVlUnVsZVNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgbXkgJVhNTEZvcm1PdXRwdXRQYXJhbTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YVByZXNlbnRNb2RlCiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkWE1MRm9ybU91dHB1dFBhcmFte1hNTERhdGF9ID0gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5fWE1MRm9ybU91dHB1dCgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICAlWE1MRm9ybU91dHB1dFBhcmFtLAogICAgICAgICAgICAgICAgICAgIExldmVsICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJElucHV0S2V5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IHRvIHNvcnQgcm93cyBjb3JyZWN0bHkKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93JyApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYWRkIGJ1dHRvbgogICAgICAgIGlmICggJExvb3AgPCAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc2V0IHByZWZpeAogICAgICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnWE1MUm93QWRkJyApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IGFkZCBjb250ZW50IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dBZGRDb250ZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuICAgICA9PiA0IC0gJFBhcmFte0xldmVsfSwKICAgICAgICAgICAgICAgICAgICBJbnB1dEtleSAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93IGFkZCBjb250ZW50IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdYTUxSb3dBZGRDb250ZW50U3BhY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+ICRQYXJhbXtMZXZlbH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgcnVsZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkUnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+IDYgLSAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdyBhZGQgcnVsZSBzcGFjZSwgaWYgbGV2ZWwgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmICggJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnWE1MUm93QWRkUnVsZVNwYWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkUGFyYW17TGV2ZWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtIC0gdGlja2V0IGhpc3RvcnkKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LnBtLHYgMS44IDIwMDkvMDgvMzEgMTQ6NTY6NTUgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyggREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IENvbmZpZ09iamVjdAogICAgICAgIFBhcmFtT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0ICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntDb25maWdJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ0l0ZW1JRH0gKSB7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3Qgc2hvdyBoaXN0b3J5LCBubyBDb25maWdJdGVtSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU5hbWUgPSAkQ29uZmlnSXRlbS0+e051bWJlcn07CgogICAgIyBnZXQgYWxsIGVudHJpZXMgaW4gdGhlIGhpc3RvcnkgZm9yIHRoaXMgY29uZmlnIGl0ZW0KICAgIG15ICRMaW5lcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgIyBnZXQgc2hvd24gdXNlciBpbmZvCiAgICBteSBATmV3TGluZXMgPSBAeyRMaW5lc307CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Okhpc3RvcnlPcmRlcicpIGVxICdyZXZlcnNlJyApIHsKICAgICAgICBATmV3TGluZXMgPSByZXZlcnNlIEB7JExpbmVzfTsKICAgIH0KCiAgICAjIGdldCBkZWZpbml0aW9uIGZvciBDSSdzIGNsYXNzCiAgICBteSAkRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICBteSAkVGFibGUgICA9ICcnOwogICAgbXkgJENvdW50ZXIgPSAxOwogICAgbXkgJFZlcnNpb24gPSAwOwogICAgZm9yIG15ICREYXRhVG1wIChATmV3TGluZXMpIHsKICAgICAgICAkQ291bnRlcisrOwogICAgICAgIG15ICVEYXRhID0gKAogICAgICAgICAgICAleyREYXRhVG1wfSwKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uLAogICAgICAgICk7CgogICAgICAgICMgdHJpbSB0aGUgY29tbWVudCB0byBvbmx5IHNob3cgdmVyc2lvbiBudW1iZXIKICAgICAgICBpZiAoICREYXRhe0hpc3RvcnlUeXBlfSBlcSAnVmVyc2lvbkNyZWF0ZScgKSB7CiAgICAgICAgICAgICREYXRhe0NvbW1lbnR9ID1+IHMvXEQvL2c7CiAgICAgICAgICAgICREYXRhe1ZlcnNpb25JRH0gPSAkRGF0YXtDb21tZW50fTsKICAgICAgICAgICAgJFZlcnNpb24gPSAkRGF0YXtDb21tZW50fTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF0YXtIaXN0b3J5VHlwZX0gZXEgJ1ZhbHVlVXBkYXRlJyApIHsKCiAgICAgICAgICAgICMgYmVhdXRpZnkgY29tbWVudAogICAgICAgICAgICBteSBAUGFydHMgPSBzcGxpdCAvJSUvLCAkRGF0YXtDb21tZW50fTsKICAgICAgICAgICAgJFBhcnRzWzBdID1+IHN7IFxBIFxbLio/XF0gXHsnVmVyc2lvbidcfSBcWy4qP1xdIFx7JyB9e314bXM7CiAgICAgICAgICAgICRQYXJ0c1swXSA9fiBzeyAnXH0gXFsuKj9cXSBceycgfXs6On14bXNnOwogICAgICAgICAgICAkUGFydHNbMF0gPX4gc3sgJ1x9IFxbLio/XF0gXHogfXt9eG1zOwoKICAgICAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBhdHRyaWJ1dGUKICAgICAgICAgICAgbXkgJEF0dHJpYnV0ZUluZm8gPSAkU2VsZi0+X0dldEF0dHJpYnV0ZUluZm8oCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgICAgICAgICBQYXRoICAgICAgID0+ICRQYXJ0c1swXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZUluZm8gJiYgJEF0dHJpYnV0ZUluZm8tPntJbnB1dH0tPntUeXBlfSBlcSAnR2VuZXJhbENhdGFsb2cnICkgewogICAgICAgICAgICAgICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRBdHRyaWJ1dGVJbmZvLT57SW5wdXR9LT57Q2xhc3N9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFydHNbMV0gPSAkSXRlbUxpc3QtPnsgJFBhcnRzWzFdIH0gfHwgJyc7CiAgICAgICAgICAgICAgICAkUGFydHNbMl0gPSAkSXRlbUxpc3QtPnsgJFBhcnRzWzJdIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYXNzZW1ibGUgcGFydHMKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSBqb2luICclJScsIEBQYXJ0czsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF0YXtIaXN0b3J5VHlwZX0gZXEgJ0RlcGxveW1lbnRTdGF0ZVVwZGF0ZScgKSB7CgogICAgICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBuYW1lcwogICAgICAgICAgICBteSBAUGFydHMgPSBzcGxpdCAvJSUvLCAkRGF0YXtDb21tZW50fTsKICAgICAgICAgICAgZm9yIG15ICRQYXJ0IChAUGFydHMpIHsKICAgICAgICAgICAgICAgICRQYXJ0ID0gJERlcGxTdGF0ZUxpc3QtPnskUGFydH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYXNzZW1ibGUgcGFydHMKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSBqb2luICclJScsIEBQYXJ0czsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF0YXtIaXN0b3J5VHlwZX0gZXEgJ0luY2lkZW50U3RhdGVVcGRhdGUnICkgewoKICAgICAgICAgICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IG5hbWVzCiAgICAgICAgICAgIG15IEBQYXJ0cyA9IHNwbGl0IC8lJS8sICREYXRhe0NvbW1lbnR9OwogICAgICAgICAgICBmb3IgbXkgJFBhcnQgKEBQYXJ0cykgewogICAgICAgICAgICAgICAgJFBhcnQgPSAkRGVwbFN0YXRlTGlzdC0+eyRQYXJ0fSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhc3NlbWJsZSBwYXJ0cwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9IGpvaW4gJyUlJywgQFBhcnRzOwogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIHRleHQKICAgICAgICBpZiAoICREYXRhe0NvbW1lbnR9ICkgewogICAgICAgICAgICBteSAlSW5mbyA9ICgpOwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9fiBzL14lJS8vZzsKICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUvLCAkRGF0YXtDb21tZW50fSApOwogICAgICAgICAgICAkRGF0YXtDb21tZW50fSA9ICcnOwogICAgICAgICAgICBmb3IgKEBWYWx1ZXMpIHsKICAgICAgICAgICAgICAgIGlmICggJERhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gLj0gIlwiLCAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gLj0gIlwiJF8iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISREYXRhe0NvbW1lbnR9ICkgewogICAgICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPSAnIiAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe0NvbW1lbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAnQ0lIaXN0b3J5OjonIC4gJERhdGF7SGlzdG9yeVR5cGV9IC4gJyIsICcgLiAkRGF0YXtDb21tZW50fQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgbm90IG5lZWRlZCBwbGFjZSBob2xkZXIKICAgICAgICAgICAgJERhdGF7Q29tbWVudH0gPX4gcy9cJXMvL2c7CiAgICAgICAgfQoKICAgICAgICAjIHNlcGVyYXRlIGVhY2ggc2VhcmNocmVzdWx0IGxpbmUgYnkgdXNpbmcgc2V2ZXJhbCBjc3MKICAgICAgICBpZiAoICRDb3VudGVyICUgMiApIHsKICAgICAgICAgICAgJERhdGF7Y3NzfSA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhe2Nzc30gPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBwYWdlCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRDb25maWdJdGVtTmFtZSApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtSGlzdG9yeScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtTmFtZSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVmVyc2lvbklEICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9HZXRBdHRyaWJ1dGVJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERlZmluaXRpb24gUGF0aCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN1YnRyZWUgPSAkUGFyYW17RGVmaW5pdGlvbn07CiAgICBteSAkSW5mbzsKCiAgICBQQVJUOgogICAgZm9yIG15ICRQYXJ0ICggc3BsaXQgLzo6LywgJFBhcmFte1BhdGh9ICkgewogICAgICAgIG15ICgkRm91bmQpID0gZ3JlcCB7ICRfLT57S2V5fSBlcSAkUGFydCB9IEB7JFN1YnRyZWV9OwoKICAgICAgICBsYXN0IFBBUlQgaWYgISRGb3VuZDsKCiAgICAgICAgJFN1YnRyZWUgPSAkRm91bmQtPntTdWJ9OwogICAgICAgICRJbmZvICAgID0gJEZvdW5kOwogICAgfQoKICAgIHJldHVybiAkSW5mbzsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSAtIHByaW50IGxheW91dCBmb3IgaXRzbSBjb25maWcgaXRlbSBhZ2VudCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5wbSx2IDEuMyAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1BERk9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApOwogICAgbXkgJFZlcnNpb25JRCAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCB8fCAhJFZlcnNpb25JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb25maWdJdGVtSUQgJENvbmZpZ0l0ZW1JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICApOwogICAgaWYgKCAhJFZlcnNpb24tPntWZXJzaW9uSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJWZXJzaW9uSUQgJFZlcnNpb25JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwogICAgJENvbmZpZ0l0ZW0tPntDdXJyZW50TmFtZX0gPSAkTGFzdFZlcnNpb24tPntOYW1lfTsKCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBteSAkVmVyc2lvbk51bWJlciA9IDE7CiAgICBMSVNUVkVSU0lPTklEOgogICAgZm9yIG15ICRMaXN0VmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewoKICAgICAgICBsYXN0IExJU1RWRVJTSU9OSUQgaWYgJFZlcnNpb25JRCBlcSAkTGlzdFZlcnNpb25JRDsKICAgICAgICAkVmVyc2lvbk51bWJlcisrOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSBvZiBjb25maWcgaXRlbSAoY3JlYXRlIGJ5KQogICAgbXkgJUNvbmZpZ0l0ZW1DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ29uZmlnSXRlbS0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXNlciBkYXRhIG9mIGNvbmZpZyBpdGVtIChjaGFuZ2UgYnkpCiAgICBteSAlQ29uZmlnSXRlbUNoYW5nZUJ5ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgb2YgdmVyc2lvbiAoY3JlYXRlIGJ5KQogICAgbXkgJVZlcnNpb25DcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVmVyc2lvbi0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHR5cGUgbGlzdAogICAgbXkgJUxpbmtUeXBlTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaW5rIGRhdGEKICAgIG15ICVMaW5rRGF0YTsKICAgIGlmICggJExpbmtMaXN0V2l0aERhdGEgJiYgcmVmICRMaW5rTGlzdFdpdGhEYXRhIGVxICdIQVNIJyAmJiAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICAlTGlua0RhdGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAnU2ltcGxlUmF3JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CgogICAgICAgIG15ICVQYWdlOwogICAgICAgIG15ICRVcmwgPSAnICc7CgogICAgICAgIGlmICggJEVOVntSRVFVRVNUX1VSSX0gKSB7CiAgICAgICAgICAgICRVcmwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSHR0cFR5cGUnKSAuICc6Ly8nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgICAgIC4gJEVOVntSRVFVRVNUX1VSSX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KCiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ29uZmlnSXRlbScpIC4gJyMnCiAgICAgICAgICAgIC4gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gID0gJFZlcnNpb24tPntOYW1lfTsKICAgICAgICAkUGFnZXtIZWFkbGluZVJpZ2h0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5JykgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJyRFbnZ7IlRpbWUifScgKTsKICAgICAgICAkUGFnZXtGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzonIC4gJFZlcnNpb24tPntOYW1lfSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgb3V0cHV0IGdlbmVyYWwgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEdlbmVyYWxJbmZvcygKICAgICAgICAgICAgUGFnZSAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgPT4gXCVDb25maWdJdGVtQ3JlYXRlQnksCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gXCVDb25maWdJdGVtQ2hhbmdlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlua2VkIG9iamVjdHMKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBMaW5rRGF0YSAgICAgPT4gXCVMaW5rRGF0YSwKICAgICAgICAgICAgICAgIExpbmtUeXBlTGlzdCA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHZlcnNpb24gaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFZlcnNpb25JbmZvcygKICAgICAgICAgICAgUGFnZSAgICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFZlcnNpb24gICAgICAgPT4gJFZlcnNpb24sCiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gJFZlcnNpb25OdW1iZXIsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gXCVWZXJzaW9uQ3JlYXRlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgZmlsZSBuYW1lCiAgICAgICAgbXkgJEZpbGVuYW1lID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkQ29uZmlnSXRlbS0+e051bWJlcn0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICApOwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnY29uZmlnaXRlbV8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkVmVyc2lvbi0+e05hbWV9ICk7CgogICAgICAgIGlmICglTGlua0RhdGEpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUeXBlTmFtZSA9PiAkTGlua1R5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICAgICAgICAgIG15ICRPYmplY3RMaXN0ID0gJExpbmtEYXRheyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZVJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rU3RyZyA9PiAkSXRlbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCB2ZXJzaW9uIGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAiVmVyc2lvbiIsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICAgICBWZXJzaW9uTnVtYmVyICAgICAgICAgPT4gJFZlcnNpb25OdW1iZXIsCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJFZlcnNpb25DcmVhdGVCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyRmlyc3RuYW1lID0+ICRWZXJzaW9uQ3JlYXRlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMYXN0bmFtZSAgPT4gJFZlcnNpb25DcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHhtbCBzdHJ1Y3R1cmUKICAgICAgICBpZiAoCiAgICAgICAgICAgICRWZXJzaW9uCiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbiBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufQogICAgICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9CiAgICAgICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0gICAgICAgZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0KICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0KICAgICAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259IGVxICdBUlJBWScKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPl9IVE1MT3V0cHV0WE1MU3RydWN0dXJlKAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkVmVyc2lvbi0+e1hNTERlZmluaXRpb259LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1QcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAleyRDb25maWdJdGVtfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckxvZ2luICAgICA9PiAkQ29uZmlnSXRlbUNyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENvbmZpZ0l0ZW1DcmVhdGVCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5VXNlckxhc3RuYW1lICA9PiAkQ29uZmlnSXRlbUNyZWF0ZUJ5e1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJMb2dpbiAgICAgPT4gJENvbmZpZ0l0ZW1DaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDb25maWdJdGVtQ2hhbmdlQnl7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeVVzZXJMYXN0bmFtZSAgPT4gJENvbmZpZ0l0ZW1DaGFuZ2VCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICAjIHJldHVybiBvdXRwdXQKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRHZW5lcmFsSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBDb25maWdJdGVtIENyZWF0ZUJ5IENoYW5nZUJ5KSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2xhc3MnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NvbmZpZ0l0ZW19LT57Q2xhc3N9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ29uZmlnSXRlbScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q29uZmlnSXRlbX0tPntDdXJyZW50TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXJyZW50IERlcGxveW1lbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAkUGFyYW17Q29uZmlnSXRlbX0tPntDdXJEZXBsU3RhdGV9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VycmVudCBJbmNpZGVudCBTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtfS0+e0N1ckluY2lTdGF0ZX0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGFzdCBjaGFuZ2VkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjQUFBQUFBJzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvck9kZH0gICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJExpbmtUeXBlTmFtZSk7CgogICAgICAgICMgZGVmaW5lIGhlYWRsaW5lCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExpbmtUeXBlTmFtZSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJyc7CgogICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFBhcmFte0xpbmtEYXRhfS0+eyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSB8fD0gJyc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkSXRlbS0+e1RpdGxlfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZSB7CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMaW5rZWQgT2JqZWN0cycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRWZXJzaW9uSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBWZXJzaW9uIFZlcnNpb25OdW1iZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVmVyc2lvbicpIC4gJyAnCiAgICAgICAgICAgIC4gJFBhcmFte1ZlcnNpb25OdW1iZXJ9LAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyBjcmVhdGUgdGFibGUKICAgIG15ICRUYWJsZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17VmVyc2lvbn0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMb2dpbn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJyAnLAogICAgICAgICAgICBWYWx1ZSA9PiAnICcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdOYW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtWZXJzaW9ufS0+e05hbWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRGVwbG95bWVudCBTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZlcnNpb259LT57RGVwbFN0YXRlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW5jaWRlbnQgU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWZXJzaW9ufS0+e0luY2lTdGF0ZX0gKSwKICAgICAgICB9LAogICAgXTsKCiAgICAjIGFkZCB4bWwgZGF0YSB0byB0YWJsZQogICAgaWYgKAogICAgICAgIHJlZiAkUGFyYW17VmVyc2lvbn0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGVmaW5pdGlvbn0KICAgICAgICAmJiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfQogICAgICAgICYmIHJlZiAkUGFyYW17VmVyc2lvbn0tPntYTUxEZWZpbml0aW9ufSBlcSAnQVJSQVknCiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9ICAgICAgIGVxICdBUlJBWScKICAgICAgICAmJiAkUGFyYW17VmVyc2lvbn0tPntYTUxEYXRhfS0+WzFdCiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFBhcmFte1ZlcnNpb259LT57WE1MRGF0YX0tPlsxXS0+e1ZlcnNpb259CiAgICAgICAgJiYgcmVmICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufSBlcSAnQVJSQVknCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5fUERGT3V0cHV0WE1MT3V0cHV0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRQYXJhbXtWZXJzaW9ufS0+e1hNTERlZmluaXRpb259LAogICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtWZXJzaW9ufS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICBUYWJsZURhdGEgICAgID0+ICRUYWJsZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvd3MgPSBAeyRUYWJsZX07CgogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRUYWJsZS0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDEwMDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQxMTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRYTUxPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17VGFibGVEYXRhfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGF9OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtUYWJsZURhdGF9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc3RvcCBsb29wLCBpZiBubyBjb250ZW50IHdhcyBnaXZlbgogICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CgogICAgICAgICAgICAjIGxvb2t1cCB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbmV3IHJvdwogICAgICAgICAgICBteSAkTmV3Um93ID0gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRJdGVtLT57TmFtZX0gKSAuICc6JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgb3V0cHV0IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgZm9yICggMSAuLiAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgICAgICROZXdSb3ctPntLZXl9ICAgPSAnICAgICcgLiAkTmV3Um93LT57S2V5fTsKICAgICAgICAgICAgICAgICAgICAkTmV3Um93LT57VmFsdWV9ID0gJyAgICAnIC4gJE5ld1Jvdy0+e1ZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcm93IGRhdGEKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17VGFibGVEYXRhfSB9LCAkTmV3Um93OwoKICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0WE1MT3V0cHV0KAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgICAgIFRhYmxlRGF0YSAgICAgPT4gJFBhcmFte1RhYmxlRGF0YX0sCiAgICAgICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVE1MT3V0cHV0WE1MU3RydWN0dXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERhdGF9OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIENPVU5URVI6CiAgICAgICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAkSXRlbS0+e0NvdW50TWF4fSApIHsKCiAgICAgICAgICAgICMgc3RvcCBsb29wLCBpZiBubyBjb250ZW50IHdhcyBnaXZlbgogICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CgogICAgICAgICAgICAjIGxvb2t1cCB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGRhdGEgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb25Sb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSB8fCAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBzcGFjZSwgaWYgbGV2ZWwgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmICggJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gJFBhcmFte0xldmVsfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdWZXJzaW9uUm93TmFtZVByZScgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdWZXJzaW9uUm93VmFsdWVQcmUnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQ09VTlRFUiBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICAkU2VsZi0+X0hUTUxPdXRwdXRYTUxTdHJ1Y3R1cmUoCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICA9PiAkUGFyYW17TGV2ZWx9ICsgMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBzZWFyY2ggbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtLHYgMS4zIDIwMDkvMDUvMTggMDk6NTc6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjb25maWcgaXRlbSBzZWFyY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBdHRyaWJ1dGUnICkgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdObyBDbGFzc0lEIGlzIGdpdmVuIScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICREZXBsU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIERlcGxTdGF0ZU9wdGlvblN0cmcKICAgICAgICBteSAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgU2l6ZSAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICAgICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEluY2lTdGF0ZU9wdGlvblN0cmcKICAgICAgICBteSAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgU2l6ZSAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcKICAgICAgICBteSAkUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByZXZpb3VzVmVyc2lvblNlYXJjaCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAgICAgMSA9PiAnWWVzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dHJpYnV0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgICAgICAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgICAgPT4gJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVPcHRpb25TdHJnICAgID0+ICRDdXJJbmNpU3RhdGVPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZyA9PiAkUHJldmlvdXNWZXJzaW9uT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgICAgICBteSAkWE1MRGVmaW5pdGlvbiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhYm9ydCwgaWYgbm8gZGVmaW5pdGlvbiBpcyBkZWZpbmVkCiAgICAgICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIERlZmluaXRpb24gd2FzIGRlZmluaWVkIGZvciBjbGFzcyAkQ2xhc3NMaXN0LT57JENsYXNzSUR9ISIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IHhtbCBzZWFyY2ggZm9ybQogICAgICAgIGlmICggJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtT3V0cHV0KAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnU2VhcmNoJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY29uZmlnIGl0ZW0gY2xhc3Mgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjbGFzcyBpZAogICAgICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENsYXNzSUQgfHwgJycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSAgICAgPT4gJ2RvY3VtZW50LmNvbmZpZ2l0ZW1jbGFzcy5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY2xhc3MgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnU2VhcmNoJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1hNTFNlYXJjaEZvcm1PdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwoKICAgICRQYXJhbXtMZXZlbH0gfHw9IDA7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIHNldCBwcmVmaXgKICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgICAgID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgICROYW1lICAgICA9ICRQYXJhbXtQcmVmaXhOYW1lfSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSwgaWYgbWFya2VkIGFzIHNlYXJjaGFibGUKICAgICAgICBpZiAoICRJdGVtLT57U2VhcmNoYWJsZX0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggaW5wdXQgZWxlbWVudAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBLZXkgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRyaWJ1dGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTFNlYXJjaEZvcm1PdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hSZXN1bHQucG0gLSB0aGUgT1RSUzo6SVRTTSBjb25maWcgaXRlbSBzZWFyY2ggcmVzdWx0IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdC5wbSx2IDEuMyAyMDA5LzA1LzE4IDA5OjU3OjA1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNsYXNzIGlkCiAgICBteSAlU2VhcmNoQXR0cmlidXRlOwogICAgJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc0lEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICk7CgogICAgaWYgKCAhJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc0lEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ0xhc3NJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbHVlcwogICAgRk9STVZBTFVFOgogICAgZm9yIG15ICRGb3JtVmFsdWUgKHF3KE51bWJlciBOYW1lIFByZXZpb3VzVmVyc2lvblNlYXJjaCkpIHsKCiAgICAgICAgIyBnZXQgdmFsdWUKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtVmFsdWUgKTsKCiAgICAgICAgbmV4dCBGT1JNVkFMVUUgaWYgISRWYWx1ZTsKCiAgICAgICAgJFNlYXJjaEF0dHJpYnV0ZXskRm9ybVZhbHVlfSA9ICRWYWx1ZTsKICAgIH0KCiAgICAjIGdldCBhcnJheXMKICAgIEZPUk1BUlJBWToKICAgIGZvciBteSAkRm9ybUFycmF5IChxdyhEZXBsU3RhdGVJRHMgSW5jaVN0YXRlSURzKSkgewoKICAgICAgICAjIGdldCBhcnJheQogICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJEZvcm1BcnJheSApOwoKICAgICAgICBuZXh0IEZPUk1BUlJBWSBpZiAhQEFycmF5OwoKICAgICAgICAkU2VhcmNoQXR0cmlidXRleyRGb3JtQXJyYXl9ID0gXEBBcnJheTsKICAgIH0KCiAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0sCiAgICApOwoKICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgaWYgKCAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBEZWZpbml0aW9uIHdhcyBkZWZpbmllZCBmb3IgY2xhc3MgJFNlYXJjaEF0dHJpYnV0ZXtDbGFzc30hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB4bWwgc2VhcmNoIGZvcm0KICAgIG15ICRYTUxGb3JtRGF0YSA9IFtdOwogICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtR2V0KAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBYTUxGb3JtRGF0YSAgID0+ICRYTUxGb3JtRGF0YSwKICAgICk7CgogICAgaWYgKCBAeyRYTUxGb3JtRGF0YX0gKSB7CiAgICAgICAgJFNlYXJjaEF0dHJpYnV0ZXtXaGF0fSA9ICRYTUxGb3JtRGF0YTsKICAgIH0KCiAgICAjIHN0YXJ0IHNlYXJjaAogICAgbXkgJFNlYXJjaFJlc3VsdExpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgJVNlYXJjaEF0dHJpYnV0ZSwKICAgICAgICBDbGFzc0lEcyA9PiBbICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0gXSwKICAgICk7CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgbXkgJFRvdGFsSGl0cyA9IEB7JFNlYXJjaFJlc3VsdExpc3R9OwogICAgbXkgJENzc0NsYXNzICA9ICcnOwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRTZWFyY2hSZXN1bHRMaXN0fSApIHsKCiAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAjIGdldCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskTGFzdFZlcnNpb259LAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRMYXN0VmVyc2lvbi0+e0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZWFyY2gnICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVNlYXJjaEF0dHJpYnV0ZSwKICAgICAgICAgICAgVG90YWxIaXRzID0+ICRUb3RhbEhpdHMsCiAgICAgICAgICAgIENsYXNzICAgICA9PiAkQ2xhc3NMaXN0LT57ICRTZWFyY2hBdHRyaWJ1dGV7Q2xhc3NJRH0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1hNTFNlYXJjaEZvcm1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxGb3JtRGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRm9ybURhdGF9IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICMgY3JlYXRlIGlucHV0a2V5CiAgICAgICAgbXkgJElucHV0S2V5ID0gJEl0ZW0tPntLZXl9OwogICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJbnB1dEtleSA9ICRQYXJhbXtQcmVmaXh9IC4gJzo6JyAuICRJbnB1dEtleTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlYXJjaCBmb3JtIGRhdGEKICAgICAgICBteSAkVmFsdWVzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgICAgICBLZXkgID0+ICRJbnB1dEtleSwKICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBzZWFyY2ggYXJyYXkKICAgICAgICBteSBAU2VhcmNoVmFsdWVzOwogICAgICAgIFZBTFVFOgogICAgICAgIGZvciBteSAkVmFsdWUgKCBAeyRWYWx1ZXN9ICkgewoKICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhJFZhbHVlOwoKICAgICAgICAgICAgcHVzaCBAU2VhcmNoVmFsdWVzLCAkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoQFNlYXJjaFZhbHVlcykgewoKICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGtleQogICAgICAgICAgICBteSAkU2VhcmNoS2V5ID0gJElucHV0S2V5OwogICAgICAgICAgICAkU2VhcmNoS2V5ID1+IHN7IDo6IH17XCdcfVslXVx7XCd9eG1zZzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgIG15ICRTZWFyY2hIYXNoID0gewogICAgICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiBcQFNlYXJjaFZhbHVlcywKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1hNTEZvcm1EYXRhfSB9LCAkU2VhcmNoSGFzaDsKICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgJFNlbGYtPl9YTUxTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgWE1MRm9ybURhdGEgICA9PiAkUGFyYW17WE1MRm9ybURhdGF9LAogICAgICAgICAgICBMZXZlbCAgICAgICAgID0+ICRQYXJhbXtMZXZlbH0gKyAxLAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRJbnB1dEtleSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtIC0gdGhlIE9UUlM6OklUU00gY29uZmlnIGl0ZW0gem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnBtLHYgMS40IDIwMDkvMDkvMDMgMTM6NTE6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDb25maWdJdGVtSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICkgfHwgMDsKICAgIG15ICRWZXJzaW9uSUQgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWZXJzaW9uSUQnICkgICAgfHwgMDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gQ29uZmlnSXRlbUlEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc2hvdyB2ZXJzaW9ucwogICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAwOwogICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTaG93VmVyc2lvbnMnICkgKSB7CiAgICAgICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAxOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CiAgICBpZiAoICEkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZlcnNpb24gbGlzdAogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvblpvb21MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKICAgIGlmICggISRWZXJzaW9uTGlzdC0+WzBdLT57VmVyc2lvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gVmVyc2lvbiBmb3VuZCBmb3IgQ29uZmlnSXRlbUlEICRDb25maWdJdGVtSUQhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB2ZXJzaW9uIGlkCiAgICBpZiAoICEkVmVyc2lvbklEICkgewogICAgICAgICRWZXJzaW9uSUQgPSAkVmVyc2lvbkxpc3QtPlstMV0tPntWZXJzaW9uSUR9OwogICAgfQogICAgaWYgKCAkVmVyc2lvbklEIG5lICRWZXJzaW9uTGlzdC0+Wy0xXS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgJFBhcmFte1Nob3dWZXJzaW9uc30gPSAxOwogICAgfQoKICAgICMgc2V0IHZlcnNpb24gaWQgaW4gcGFyYW0gaGFzaCAob25seSBmb3IgbWVudSBtb2R1bGUpCiAgICBpZiAoJFZlcnNpb25JRCkgewogICAgICAgICRQYXJhbXtWZXJzaW9uSUR9ID0gJFZlcnNpb25JRDsKICAgIH0KCiAgICAjIHJ1biBjb25maWcgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWxmLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkQ29uZmlnSXRlbSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB2ZXJzaW9uIHRyZWUKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RyZWUnICk7CiAgICBteSAkQ291bnRlciA9IDE7CiAgICBpZiAoICEkUGFyYW17U2hvd1ZlcnNpb25zfSAmJiAkVmVyc2lvbklEIGVxICRWZXJzaW9uTGlzdC0+Wy0xXS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgJENvdW50ZXIgICAgID0gQHskVmVyc2lvbkxpc3R9OwogICAgICAgICRWZXJzaW9uTGlzdCA9IFsgJFZlcnNpb25MaXN0LT5bLTFdIF07CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICBteSAkTGFzdFZlcnNpb24gPSAkVmVyc2lvbkxpc3QtPlstMV07CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICk7CgogICAgIyBvdXRwdXQgdmVyc2lvbiB0cmVlCiAgICBmb3IgbXkgJFZlcnNpb25IYXNoICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICApOwogICAgICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFZlcnNpb25IYXNoLT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMQogICAgICAgICk7CiAgICAgICAgaWYgKCAkVmVyc2lvbkhhc2gtPntWZXJzaW9uSUR9IGVxICRWZXJzaW9uSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUFjdGl2ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJVVzZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICAgICAgICAgICV7JFZlcnNpb25IYXNofSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIEluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkVmVyc2lvbkhhc2gtPntJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUluYWN0aXZlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlVXNlckluZm8sCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgJXskVmVyc2lvbkhhc2h9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgSW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRWZXJzaW9uSGFzaC0+e0luY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkQ29uZmlnSXRlbS0+e051bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbklELAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgJFZlcnNpb24KICAgICAgICAmJiByZWYgJFZlcnNpb24gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufQogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0KICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSBlcSAnQVJSQVknCiAgICAgICAgJiYgcmVmICRWZXJzaW9uLT57WE1MRGF0YX0gICAgICAgZXEgJ0FSUkFZJwogICAgICAgICYmICRWZXJzaW9uLT57WE1MRGF0YX0tPlsxXQogICAgICAgICYmIHJlZiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0KICAgICAgICAmJiByZWYgJFZlcnNpb24tPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0gZXEgJ0FSUkFZJwogICAgICAgICkKICAgIHsKCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWZXJzaW9uLT57TmFtZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbmFtZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgbmFtZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRWZXJzaW9uLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgZGVwbG95bWVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnSW5jaWRlbnQgU3RhdGUnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdGFydCB4bWwgb3V0cHV0CiAgICAgICAgJFNlbGYtPl9YTUxPdXRwdXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFZlcnNpb24tPntYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbi0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJENvbmZpZ0l0ZW0tPntDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ID0gJENyZWF0ZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRDb25maWdJdGVtLT57ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSA9ICRDaGFuZ2VVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRMYXN0VmVyc2lvbn0sCiAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJExhc3RWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgbGluayB0YWJsZQogICAgaWYgKCRMaW5rVGFibGVTdHJnKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlJyAuICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Db25maWdJdGVtWm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0KICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9YTUxPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgJFBhcmFte0xldmVsfSB8fD0gMDsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgbG9va3VwIHZhbHVlCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFZhbHVlTG9va3VwKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgZGF0YSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0YScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHNwYWNlLCBpZiBsZXZlbCB3YXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKCAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgZm9yICggMSAuLiAkUGFyYW17TGV2ZWx9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0RhdGFOYW1lUHJlJyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0RhdGFWYWx1ZVByZScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5fWE1MT3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXIgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY3VzdG9tZXIgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgPT4gJFBhcmFte1ZhbHVlfSB8fCAnJywKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBzZWxlY3RlZCBjdXN0b21lciB1c2VyCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICMgY2hlY2sgc2VhcmNoIGJ1dHRvbgogICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uU2VhcmNoJyApICkgewogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlYXJjaCcgKTsKICAgIH0KCiAgICAjIGNoZWNrIHNlbGVjdCBidXR0b24KICAgIGVsc2lmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlbGVjdCcgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlbGVjdCcgKTsKICAgIH0KCiAgICAjIGNoZWNrIGNsZWFyIGJ1dHRvbgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uQ2xlYXInICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmVzZXQgdmFsdWUgaWYgc2VhcmNoIGZpZWxkIGlzIGVtdHkKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApCiAgICAgICAgICAgICYmIGRlZmluZWQgJEZvcm1EYXRhe1ZhbHVlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIG9wdGlvbgogICAgICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICcnOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgfQogICAgbXkgJFNpemUgICAgICAgICA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDUwOwogICAgbXkgJFNlYXJjaCAgICAgICA9ICcnOwogICAgbXkgJFN0cmluZ09wdGlvbiA9ICcnOwogICAgbXkgJFN0cmluZ1NlbGVjdCA9ICcnOwoKICAgICMgY3VzdG9tZXIgc2VhcmNoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9ICkgewoKICAgICAgICAjIHN0YXJ0IHNlYXJjaAogICAgICAgIG15ICVDdXN0b21lclNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoTGlzdCkgewoKICAgICAgICAgICAgIyBjcmVhdGUgb3B0aW9uIGxpc3QKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVDdXN0b21lclNlYXJjaExpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdHJpbmdPcHRpb24gLj0gJzxicj4nOwoKICAgICAgICAgICAgIyBjcmVhdGUgc2VsZWN0IGJ1dHRvbgogICAgICAgICAgICAkU3RyaW5nU2VsZWN0ID0gJzxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicKICAgICAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgICAgIC4gJzo6QnV0dG9uU2VsZWN0IiAnCiAgICAgICAgICAgICAgICAuICd2YWx1ZT0iJFRleHR7IlNlbGVjdCJ9Ij4mbmJzcDsnOwoKICAgICAgICAgICAgIyBzZXQgc2VhcmNoCiAgICAgICAgICAgICRTZWFyY2ggPSAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgY3VzdG9tZXIgc3RyaW5nCiAgICBlbHNpZiAoJFZhbHVlKSB7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgICAgICBteSAlQ3VzdG9tZXJTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFNlYXJjaCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2hMaXN0eyRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcKICAgICAgICA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInCiAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAuICRWYWx1ZSAuICciPicKICAgICAgICAuICc8aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICc6OlNlYXJjaCIgc2l6ZT0iJwogICAgICAgIC4gJFNpemUKICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgLiAkU2VhcmNoIC4gJyI+JyAuICc8YnI+JwogICAgICAgIC4gJFN0cmluZ09wdGlvbgogICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgIC4gJzxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicKICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAuICcmbmJzcDsnCiAgICAgICAgLiAnPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJwogICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAuICc6OkJ1dHRvbkNsZWFyIiB2YWx1ZT0iJFRleHR7IkNsZWFyIn0iPic7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wOC8xOCAyMjoxODoxOSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGUucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0RGF0ZS5wbSx2IDEuMyAyMDA5LzA3LzIxIDAwOjQ0OjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RGF0ZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDEtMDEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJFFEYXRheyJEYXRlIn0ifScsCiAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICBEYXRlID0+ICRQYXJhbXtWYWx1ZX0gLiAnIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtWYWx1ZX0gPX4gcy8wMDowMDowMC8vOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJERheSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNb250aCcgKTsKICAgIG15ICRZZWFyICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwoKICAgIGlmICggJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJERheSAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICk7CgogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkWWVhciAuICctJyAuICRNb250aCAuICctJyAuICREYXk7CiAgICB9CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVZhbHVlczsKICAgIGlmICggJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKCiAgICAgICAgaWYgKCAkVmFsdWUgPX4gL14oXGRcZFxkXGQpLShcZFxkfFxkKS0oXGRcZHxcZCkkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgfSAgPSAkMTsKICAgICAgICAgICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpNb250aCcgfSA9ICQyOwogICAgICAgICAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6OkRheScgfSAgID0gJDM7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQYXJhbXtLZXl9IC4gJzo6JywKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRVc2VkICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpVc2VkJyApOwogICAgbXkgJERheSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNb250aCcgKTsKICAgIG15ICRZZWFyICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwoKICAgIG15ICRWYWx1ZXMgPSBbXTsKICAgIGlmICggJFVzZWQgJiYgJERheSAmJiAkTW9udGggJiYgJFllYXIgKSB7CiAgICAgICAgJERheSAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgPSBzcHJpbnRmKCAiJTAyZCIsICRZZWFyICk7CgogICAgICAgIG15ICREYXRlID0gJFllYXIgLiAnLScgLiAkTW9udGggLiAnLScgLiAkRGF5OwogICAgICAgIHB1c2ggQHskVmFsdWVzfSwgJERhdGU7CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWYWx1ZXM7CiAgICAkVmFsdWVzeyAkUGFyYW17S2V5fSAuICc6Ok9wdGlvbmFsJyB9ID0gMTsKCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAkUGFyYW17S2V5fSAuICc6OicsCiAgICAgICAgRm9ybWF0ICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJVZhbHVlcywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wNy8yMSAwMDo0NDo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lLnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RGF0ZVRpbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dERhdGVUaW1lIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGRhdGV0aW1lIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREYXRlVGltZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDEtMDEgMTI6MDAnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JywKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgIERhdGUgPT4gJFBhcmFte1ZhbHVlfSAuICc6MDAnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IHx8ICcnOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJERheSAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpEYXknICk7CiAgICBteSAkTW9udGggID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1vbnRoJyApOwogICAgbXkgJFllYXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpZZWFyJyApOwogICAgbXkgJEhvdXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpIb3VyJyApOwogICAgbXkgJE1pbnV0ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpNaW51dGUnICk7CgogICAgaWYgKCAkRGF5ICYmICRNb250aCAmJiAkWWVhciApIHsKICAgICAgICAkRGF5ICAgID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgJE1vbnRoICA9IHNwcmludGYoICIlMDJkIiwgJE1vbnRoICk7CiAgICAgICAgJFllYXIgICA9IHNwcmludGYoICIlMDJkIiwgJFllYXIgKTsKICAgICAgICAkSG91ciAgID0gc3ByaW50ZiggIiUwMmQiLCAkSG91ciApOwogICAgICAgICRNaW51dGUgPSBzcHJpbnRmKCAiJTAyZCIsICRNaW51dGUgKTsKCiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRZZWFyIC4gJy0nIC4gJE1vbnRoIC4gJy0nIC4gJERheSAuICcgJyAuICRIb3VyIC4gJzonIC4gJE1pbnV0ZTsKICAgIH0KCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+ICcyMDA3LTAzLTI2IDEyOjAwJywgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVWYWx1ZXM7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgICAgIGlmICggJFZhbHVlID1+IC9eKFxkXGRcZFxkKS0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCkkL2kgKSB7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6WWVhcicgfSAgID0gJDE7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnIH0gID0gJDI7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6RGF5JyB9ICAgID0gJDM7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6SG91cicgfSAgID0gJDQ7CiAgICAgICAgICAgICRWYWx1ZXN7ICRQYXJhbXtLZXl9IC4gJzo6TWludXRlJyB9ID0gJDU7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICBQcmVmaXggICAgICAgICAgID0+ICRQYXJhbXtLZXl9IC4gJzo6JywKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDEwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gMTAsCiAgICAgICAgJVZhbHVlcywKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVXNlZCAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlVzZWQnICk7CiAgICBteSAkRGF5ICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkRheScgKTsKICAgIG15ICRNb250aCAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6TW9udGgnICk7CiAgICBteSAkWWVhciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlllYXInICk7CiAgICBteSAkSG91ciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkhvdXInICk7CiAgICBteSAkTWludXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6Ok1pbnV0ZScgKTsKCiAgICBteSAkVmFsdWVzID0gW107CiAgICBpZiAoICRVc2VkICYmICREYXkgJiYgJE1vbnRoICYmICRZZWFyICkgewogICAgICAgICREYXkgICAgPSBzcHJpbnRmKCAiJTAyZCIsICREYXkgKTsKICAgICAgICAkTW9udGggID0gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKTsKICAgICAgICAkWWVhciAgID0gc3ByaW50ZiggIiUwMmQiLCAkWWVhciApOwogICAgICAgICRIb3VyICAgPSBzcHJpbnRmKCAiJTAyZCIsICRIb3VyICk7CiAgICAgICAgJE1pbnV0ZSA9IHNwcmludGYoICIlMDJkIiwgJE1pbnV0ZSApOwoKICAgICAgICBteSAkRGF0ZSA9ICRZZWFyIC4gJy0nIC4gJE1vbnRoIC4gJy0nIC4gJERheSAuICcgJyAuICRIb3VyIC4gJzonIC4gJE1pbnV0ZTsKICAgICAgICBwdXNoIEB7JFZhbHVlc30sICREYXRlOwogICAgfQoKICAgIHJldHVybiAkVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVmFsdWVzOwogICAgJFZhbHVlc3sgJFBhcmFte0tleX0gLiAnOjpPcHRpb25hbCcgfSA9IDE7CgogICAgbXkgJFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgIFByZWZpeCAgICAgICAgICAgPT4gJFBhcmFte0tleX0gLiAnOjonLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMTAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiAxMCwKICAgICAgICAlVmFsdWVzLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtLHYgMS4zIDIwMDkvMDcvMjEgMDA6NDQ6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RHVtbXk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dER1bW15IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGR1bW15IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXREdW1teS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgpOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICByZXR1cm4gJyZuYnNwOyc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICByZXR1cm4ge307Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICByZXR1cm4gW107Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA5LzA3LzIxIDAwOjQ0OjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0R2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRHZW5lcmFsQ2F0YWxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBnZW5lcmFsIGNhdGFsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17VmFsdWV9IHx8PSAnJzsKCiAgICAjIHRyYW5zbGF0ZQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17VmFsdWV9ICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZWxlY3RlZElEID0gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnOwoKICAgICMgdHJhbnNsYXRpb24gb24gb3Igb2ZmCiAgICBteSAkVHJhbnNsYXRpb24gPSAwOwogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgJFRyYW5zbGF0aW9uID0gMTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICk7CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyYW5zbGF0aW9uLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyYW5zbGF0aW9uIG9uIG9yIG9mZgogICAgbXkgJFRyYW5zbGF0aW9uID0gMDsKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRUcmFuc2xhdGlvbiA9IDE7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgIE5hbWUgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFNpemUgICAgICAgID0+IDUsCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAkVHJhbnNsYXRpb24sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDgvMTggMjI6MTg6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXIucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0SW50ZWdlci5wbSx2IDEuNCAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEludGVnZXIgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgaW50ZWdlciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0SW50ZWdlci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICcnOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBtaW4sIG1heCBhbmQgZGVmYXVsdAogICAgbXkgJFZhbHVlTWluID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVNaW59IHx8IDE7CiAgICBteSAkVmFsdWVNYXggPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1heH0gfHwgMTsKICAgIGlmICggJFZhbHVlTWluID4gJFZhbHVlTWF4ICkgewogICAgICAgICRWYWx1ZU1pbiA9ICRWYWx1ZU1heDsKICAgIH0KICAgIGlmICgKICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IDwgJFZhbHVlTWluCiAgICAgICAgICAgIHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPiAkVmFsdWVNYXgKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPSAnJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBkYXRhIGFycmF5CiAgICBteSAkSW50ZWdlckxpc3QgPSBbXTsKICAgIGZvciBteSAkQ291bnRlciAoICRWYWx1ZU1pbiAuLiAkVmFsdWVNYXggKSB7CiAgICAgICAgcHVzaCBAeyRJbnRlZ2VyTGlzdH0sICRDb3VudGVyOwogICAgfQoKICAgICMgZ2VuZXJhdGUgc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEludGVnZXJMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnLAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IG1pbiwgbWF4IGFuZCBkZWZhdWx0CiAgICBteSAkVmFsdWVNaW4gPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZU1pbn0gfHwgMTsKICAgIG15ICRWYWx1ZU1heCA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlTWF4fSB8fCAxOwogICAgaWYgKCAkVmFsdWVNaW4gPiAkVmFsdWVNYXggKSB7CiAgICAgICAgJFZhbHVlTWluID0gJFZhbHVlTWF4OwogICAgfQogICAgaWYgKAogICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0KICAgICAgICAmJiAoCiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gPCAkVmFsdWVNaW4KICAgICAgICAgICAgfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA+ICRWYWx1ZU1heAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSA9ICcnOwogICAgfQoKICAgICMgY3JlYXRlIGRhdGEgYXJyYXkKICAgIG15ICRJbnRlZ2VyTGlzdCA9IFtdOwogICAgZm9yIG15ICRDb3VudGVyICggJFZhbHVlTWluIC4uICRWYWx1ZU1heCApIHsKICAgICAgICBwdXNoIEB7JEludGVnZXJMaXN0fSwgJENvdW50ZXI7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgID0+ICRJbnRlZ2VyTGlzdCwKICAgICAgICBOYW1lICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBTaXplICAgICAgICA9PiA1LAogICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9IHx8ICcnLAogICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHQucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0VGV4dC5wbSx2IDEuNCAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGV4dCBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJyc7CiAgICB9CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZhbHVlfSApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CiAgICBteSAkU2l6ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDQwOwogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBzaXplPVwiJFNpemVcIiAiOwoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gIj4gIjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wOS8wMyAxMzo1MToxNiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhLnBtLHYgMS40IDIwMDkvMDkvMDMgMTM6NTE6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dEFyZWE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHRBcmVhIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRleHRhcmVhIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0QXJlYS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJyc7CiAgICB9CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZhbHVlfSApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAkRm9ybURhdGF7SW52YWxpZH0gPSAxOwogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29scyA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NvbHN9IHx8IDU4OwogICAgbXkgJFJvd3MgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSb3dzfSB8fCAxMDsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CiAgICB9CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSk7CiAgICB9CiAgICBteSAkU3RyaW5nID0gIjx0ZXh0YXJlYSBuYW1lPVwiJFBhcmFte0tleX1cIiBjb2xzPVwiJENvbHNcIiByb3dzPVwiJFJvd3NcIj4kVmFsdWU8L3RleHRhcmVhPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgQFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wOS8wMyAxMzo1MToxNiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbU1lbnVHZW5lcmljLnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENvbmZpZ0l0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgZ2V0IGdyb3VwcwogICAgbXkgJEdyb3Vwc1JvCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXBSb30KICAgICAgICB8fCBbXTsKICAgIG15ICRHcm91cHNSdwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwfQogICAgICAgIHx8IFtdOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICRBY2Nlc3MgPSAwOwoKICAgICAgICAjIGZpbmQgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9OwogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IKICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnSXRlbX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbU1lbnVWZXJzaW9ucy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnMucG0sdiAxLjQgMjAwOS8wOC8xOCAyMjoxODoxOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1NZW51VmVyc2lvbnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ0l0ZW1PYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIENvbmZpZ0l0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwogICAgaWYgKCAkUGFyYW17Q291bnRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KICAgIGlmICggJFBhcmFte1Nob3dWZXJzaW9uc30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWdJdGVtfSB9LAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdIaWRlIFZlcnNpb25zJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdIaWRlIFZlcnNpb25zJywKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJmFtcDtDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSZhbXA7U2hvd1ZlcnNpb25zPTAnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ0l0ZW19IH0sCiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1Nob3cgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Nob3cgVmVyc2lvbnMnLAogICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mYW1wO0NvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JmFtcDtTaG93VmVyc2lvbnM9MScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgSFRNTCBvdXRwdXQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMiAyMDA5LzA1LzE4IDEwOjAwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aXRlbSBJVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm5zIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbU91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1PdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0IHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSVRTTUNvbmZpZ0l0ZW1Gb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaHRtbCBmb3JtIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElUU01Db25maWdJdGVtRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JVFNNTG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIHt9IGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIGlucHV0IGZpZWxkIGh0bWwgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gSVRTTUNvbmZpZ0l0ZW1TZWFyY2hGb3JtRGF0YUdldCgpCgpyZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2VhcmNoIGh0bWwgZm9ybQoKICAgIG15ICRBcnJheVJlZiA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtU2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ29uZmlnSXRlbVNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSVRTTUxvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBbXSBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZXM7Cn0KCj1pdGVtIElUU01Db25maWdJdGVtU2VhcmNoSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIHNlYXJjaCBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbVNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNvbmZpZ0l0ZW1TZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gX0lUU01Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgaW5wdXQgdHlwZSBiYWNrZW5kIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0lUU01Mb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICApOwoKPWN1dAoKc3ViIF9JVFNNTG9hZExheW91dEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SVRTTUxvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SVRTTUxvYWRMYXlvdXRCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfTsKCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntJVFNNTG9hZExheW91dEJhY2tlbmR9LT57ICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0SVRTTUNvbmZpZ0l0ZW0ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExpbmtPYmplY3RJVFNNQ29uZmlnSXRlbS5wbSx2IDEuNyAyMDA5LzA1LzE4IDEwOjAwOjUzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNQ29uZmlnSXRlbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoY29uZmlnIGl0ZW0pCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBFbmNvZGVPYmplY3QKICAgICAgICBRdWV1ZU9iamVjdCBHcm91cE9iamVjdCBQYXJhbU9iamVjdCBUaW1lT2JqZWN0IExhbmd1YWdlT2JqZWN0IFVzZXJMYW5ndWFnZSBVc2VySUQpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKICAgICRTZWxmLT57T2JqZWN0RGF0YX0gPSB7CiAgICAgICAgT2JqZWN0ICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBSZWFsbmFtZSA9PiAnQ29uZmlnSXRlbScsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICBAQmxvY2tEYXRhID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0ICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEJsb2NrbmFtZSA9PiAnQ29uZmlnSXRlbSBDb21wdXRlcicsCiAgICAgICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdDdXJJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAnMTIzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcxMjMnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPTEyMycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnVGhlIE5hbWUgb2YgdGhlIENvbmZpZyBJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0luIFJlcGFpcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnQ3VySW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJzIzNCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjM0JywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0yMzQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1RoZSBOYW1lIG9mIHRoZSBDb25maWcgSXRlbSAyMzQnLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnUHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDctMTEtMTEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGNsYXNzCiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgPSAkRGlyZWN0aW9uTGlzdC0+eyRDb25maWdJdGVtSUR9LT57Q2xhc3N9IHx8ICcnOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkQ2xhc3M7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRDbGFzc30tPnskQ29uZmlnSXRlbUlEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskQ29uZmlnSXRlbUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBAQmxvY2tEYXRhOwogICAgZm9yIG15ICRDbGFzcyAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rTGlzdCApIHsKCiAgICAgICAgIyBleHRyYWN0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbUxpc3QgPSAkTGlua0xpc3R7JENsYXNzfTsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdAogICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoCiAgICAgICAgICAgIHNvcnQgeyAkQ29uZmlnSXRlbUxpc3QtPnskYX0tPntEYXRhfS0+e05hbWV9IGNtcCAkQ29uZmlnSXRlbUxpc3QtPnskYn0tPntEYXRhfS0+e05hbWV9IH0KICAgICAgICAgICAga2V5cyAleyRDb25maWdJdGVtTGlzdH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB2ZXJzaW9uIGRhdGEKICAgICAgICAgICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbUxpc3QtPnskQ29uZmlnSXRlbUlEfS0+e0RhdGF9OwoKICAgICAgICAgICAgbXkgQEl0ZW1Db2x1bW5zID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0N1ckluY2lTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICRWZXJzaW9uLT57Q3VySW5jaVN0YXRlVHlwZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFZlcnNpb24tPntOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFZlcnNpb24tPntDdXJEZXBsU3RhdGV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVmVyc2lvbi0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgICAgICMgZGVmaW5lIHRoZSBibG9jayBkYXRhCiAgICAgICAgbXkgJUJsb2NrID0gKAogICAgICAgICAgICBPYmplY3QgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIEJsb2NrbmFtZSA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9IC4gJyAoJyAuICRDbGFzcyAuICcpJywKICAgICAgICAgICAgSGVhZGxpbmUgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NvbmZpZ0l0ZW0jJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0RlcGxveW1lbnQgU3RhdGUnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTMwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDEzMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEl0ZW1MaXN0ID0+IFxASXRlbUxpc3QsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQmxvY2tEYXRhLCBcJUJsb2NrOwogICAgfQoKICAgIHJldHVybiBAQmxvY2tEYXRhOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01Db25maWdJdGVtID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSTo1NTU1NScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ29uZmlnSXRlbSMgNTU1NTU1OiBUaGUgY29uZmlnIGl0ZW0gbmFtZScsCiAgICAgICAgICAgICAgICAgICAgQ3NzICAgICA9PiAnc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NJOjIyMjIyJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDb25maWdJdGVtIyAyMjIyMjogVGl0bGUgb2YgY29uZmlnIG5hbWUgMjIyMjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0k6Nzc3NzcnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NvbmZpZ0l0ZW0jIDc3Nzc3OiBDb25maWdJdGVtIG5hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUxpbmtPdXRwdXREYXRhOwogICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJFZlcnNpb24gPSAkRGlyZWN0aW9uTGlzdC0+eyRDb25maWdJdGVtSUR9OwoKICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJUl0ZW0gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0k6JyAuICRWZXJzaW9uLT57TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb24tPntOdW1iZXJ9ICgkVmVyc2lvbi0+e0NsYXNzfSk6ICRWZXJzaW9uLT57TmFtZX0iLAogICAgICAgICAgICAgICAgICAgIExpbmsgID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFwlSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaXRlbSBsaXN0IHRvIGxpbmsgb3V0cHV0IGRhdGEKICAgICAgICAgICAgJExpbmtPdXRwdXREYXRheyAkTGlua1R5cGUgLiAnOjonIC4gJERpcmVjdGlvbiB9LT57SVRTTUNvbmZpZ0l0ZW19ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWl0ZW0gQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBDb250ZW50RGF0YSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgcmV0dXJuIGlmICRDb250ZW50LT57VHlwZX0gbmUgJ0N1ckluY2lTaWduYWwnOwoKICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgdW5rbm93biAgICAgPT4gJ2dyYXlsZWQnLAogICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgKTsKCiAgICAjIGludmVzdGlnYXRlIGN1cnJlbnQgaW5jaWRlbnQgc2lnbmFsCiAgICAkQ29udGVudC0+e0N1ckluY2lTdGF0ZVR5cGV9IHx8PSAndW5rbm93bic7CiAgICBteSAkQ3VySW5jaVNpZ25hbCA9ICRJbmNpU2lnbmFsc3sgJENvbnRlbnQtPntDdXJJbmNpU3RhdGVUeXBlfSB9OwogICAgJEN1ckluY2lTaWduYWwgfHw9ICRJbmNpU2lnbmFsc3t1bmtub3dufTsKCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJzxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiAnCiAgICAgICAgICAgIC4gJ3RpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEN1ckluY2lTaWduYWwsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSA9PiAkQ29udGVudC0+e0NvbnRlbnR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWxlY3RhYmxlT2JqZWN0TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlbGVjdGFibGUgb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJy0nLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAnQ29uZmlnSXRlbScsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ29uZmlnSXRlbTo6MjUnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ29uZmlnSXRlbTo6Q29tcHV0ZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSVRTTUNvbmZpZ0l0ZW06OjI2JywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NvbmZpZ0l0ZW06OlNvZnR3YXJlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Db25maWdJdGVtOjoyNycsCiAgICAgICAgICAgIFZhbHVlID0+ICdDb25maWdJdGVtOjpOZXR3b3JrJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAkTGlua09iamVjdC0+U2VsZWN0YWJsZU9iamVjdExpc3QoCiAgICAgICAgU2VsZWN0ZWQgPT4gJElkZW50aWZpZXIsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgU2VsZWN0YWJsZU9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBoZWFkbGluZQogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAnLScsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfQogICAgKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENsYXNzTGlzdDsKICAgIHJldHVybiBpZiByZWYgJENsYXNzTGlzdCBuZSAnSEFTSCc7CgogICAgIyBnZXQgdGhlIGNvbmZpZyB3aXRoIHRoZSBkZWZhdWx0IHN1Ym9iamVjdHMKICAgIG15ICREZWZhdWx0U3Vib2JqZWN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OkRlZmF1bHRTdWJPYmplY3QnKSB8fCB7fTsKCiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IHsgbGMgJENsYXNzTGlzdC0+eyRhfSBjbXAgbGMgJENsYXNzTGlzdC0+eyRifSB9IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgbXkgJENsYXNzID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSB8fCAnJzsKICAgICAgICBteSAkSWRlbnRpZmllciA9ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9IC4gJzo6JyAuICRDbGFzc0lEOwoKICAgICAgICAjIHNldCBzZWxlY3RlZCBmbGFnCiAgICAgICAgbXkgJFNlbGVjdGVkOwogICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSApIHsKCiAgICAgICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSBlcSAkSWRlbnRpZmllciApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFBhcmFte1NlbGVjdGVkfSBlcSAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fQogICAgICAgICAgICAgICAgJiYgJERlZmF1bHRTdWJvYmplY3QtPnsgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGRlZmF1bHQgY2xhc3MgbmFtZQogICAgICAgICAgICAgICAgbXkgJERlZmF1bHRDbGFzcyA9ICREZWZhdWx0U3Vib2JqZWN0LT57SVRTTUNvbmZpZ0l0ZW19IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgY2xhc3MKICAgICAgICAgICAgICAgIGlmICggJERlZmF1bHRDbGFzcyBlcSAkQ2xhc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgcm93CiAgICAgICAgbXkgJVJvdyA9ICgKICAgICAgICAgICAgS2V5ICAgICAgPT4gJElkZW50aWZpZXIsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0gLiAnOjonIC4gJENsYXNzLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0U2VsZWN0TGlzdCwgXCVSb3c7CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aXRlbSBTZWFyY2hPcHRpb25MaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VhcmNoIG9wdGlvbnMKClJldHVybgoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NvbmZpZ0l0ZW0jJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyMzQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnQmxhQmxhJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KAogICAgICAgIFN1Yk9iamVjdCA9PiAnMjUnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNlYXJjaCBvcHRpb24gbGlzdAogICAgbXkgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdOdW1iZXInLAogICAgICAgICAgICBOYW1lID0+ICdDb25maWdJdGVtIycsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICBOYW1lID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgVHlwZSA9PiAnTGlzdCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIE5hbWUgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgVHlwZSA9PiAnTGlzdCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgb2JqZWN0IGRlcGVuZGVuY2UgYXR0cmlidXRlcwogICAgI2lmICggJFBhcmFte1N1Yk9iamVjdH0gKSB7CiAgICAjCiAgICAjICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICMgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICMgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAjICAgICk7CiAgICAjCiAgICAjICAgIGlmICggJENsYXNzTGlzdCAmJiAkQ2xhc3NMaXN0IGVxICdIQVNIJyApIHsKICAgICMKICAgICMgICAgICAgICMgYWRkIGhlcmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJvYmplY3QhCiAgICAjICAgIH0KICAgICN9CgogICAgIyBhZGQgZm9ybWtleQogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CiAgICAgICAgJFJvdy0+e0Zvcm1LZXl9ID0gJ1NFQVJDSDo6JyAuICRSb3ctPntLZXl9OwogICAgfQoKICAgICMgYWRkIGZvcm0gZGF0YSBhbmQgaW5wdXQgc3RyaW5nCiAgICBST1c6CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKCiAgICAgICAgIyBwcmVwYXJlIHRleHQgaW5wdXQgZmllbGRzCiAgICAgICAgaWYgKCAkUm93LT57VHlwZX0gZXEgJ1RleHQnICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwoKICAgICAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5wdXRUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFJvdy0+e0Zvcm1EYXRhfSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xpbmtPYmplY3QnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBST1c7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgbGlzdCBib3hlcwogICAgICAgIGlmICggJFJvdy0+e1R5cGV9IGVxICdMaXN0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICBteSBARm9ybURhdGEgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwogICAgICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gXEBGb3JtRGF0YTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgbXkgJUxpc3REYXRhOwogICAgICAgICAgICBpZiAoICRSb3ctPntLZXl9IGVxICdEZXBsU3RhdGVJRHMnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJERlcGxTdGF0ZUxpc3QgJiYgcmVmICREZXBsU3RhdGVMaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAlTGlzdERhdGEgPSAleyREZXBsU3RhdGVMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwcmVwYXJlIGluY2lkZW50IHN0YXRlIGxpc3QKICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57S2V5fSBlcSAnSW5jaVN0YXRlSURzJyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICAgICAgICAgICAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJEluY2lTdGF0ZUxpc3QgJiYgcmVmICRJbmNpU3RhdGVMaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAlTGlzdERhdGEgPSAleyRJbmNpU3RhdGVMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTGlzdERhdGEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFJvdy0+e0Zvcm1EYXRhfSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gMywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgUk9XOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAwOS8wNS8xOCAxMDowMDo1MyAkCgo9Y3V0Cg==
IyAtLQojIEFkbWluSVRTTUNvbmZpZ0l0ZW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbklUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbklUU01Db25maWdJdGVtLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDb25maWcgSXRlbSBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uQ2hhbmdlIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UgRGVmaW5pdGlvbiJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkNoYW5nZSJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNjAlIj4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVmaW5pdGlvbkxpc3QmQ2xhc3NJRD0kUURhdGF7IkNsYXNzSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25MaXN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjUwJSI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmVyc2lvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25MaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVmaW5pdGlvblZpZXcmRGVmaW5pdGlvbklEPSRRRGF0YXsiRGVmaW5pdGlvbklEIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7IlZlcnNpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpEZWZpbml0aW9uTGlzdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6RGVmaW5pdGlvbkxpc3QgLS0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25WaWV3IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlZpZXcifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmVyc2lvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVmVyc2lvbiJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9In0pPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTogPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVmaW5pdGlvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEZWZpbml0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25WaWV3IC0tPgo8IS0tIGR0bDpibG9jazpEZWZpbml0aW9uQ2hhbmdlIC0tPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJEZWZpbml0aW9uU2F2ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiRRRGF0YXsiQ2xhc3NJRCJ9Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29uZmlnIEl0ZW0ifSAkVGV4dHsiQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEZWZpbml0aW9uIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iRGVmaW5pdGlvbiIgcm93cz0iNTAiIGNvbHM9IjgwIiB3cmFwPSJvZmYiPiRRRGF0YXsiRGVmaW5pdGlvbiJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkRlZmluaXRpb25DaGFuZ2UgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtLmR0bCx2IDEuMyAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICRUZXh0eyJDb25maWcgSXRlbXMgc2hvd24ifTogJFFEYXRheyJSZXN1bHQifSAtCiAgICAgICRUZXh0eyJQYWdlIn06ICRRRGF0YXsiUGFnZU51bGwifQo8IS0tIGR0bDpibG9jazpQYWdlIC0tPgo8IS0tIGR0bDpibG9jazpQYWdlTm9ybWFsIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+JFFEYXRheyJQYWdlIn08L2E+CjwhLS0gZHRsOmJsb2NrOlBhZ2VOb3JtYWwgLS0+CjwhLS0gZHRsOmJsb2NrOlBhZ2VCb2xkIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkNsYXNzSUQ9JFFEYXRheyJDbGFzc0lEIn0mUGFnZT0kUURhdGF7IlBhZ2UifSI+PGI+JFFEYXRheyJQYWdlIn08L2I+PC9hPgo8IS0tIGR0bDpibG9jazpQYWdlQm9sZCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFnZSAtLT4KICAgICAgLQogICAgICAkVGV4dHsiQ29uZmlnIEl0ZW1zIGF2YWlsYWJsZSJ9OiAkUURhdGF7IkNvbmZpZ0l0ZW1zQXZhaWwifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAkVGV4dHsiQ2xhc3MifToKPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDbGFzc0lEPSRRRGF0YXsiQ2xhc3NJRCJ9Ij4kUURhdGF7IkNsYXNzIn0gKCRRRGF0YXsiQ291bnQifSk8L2E+Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzc1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkN1ckluY2lTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkN1ckluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSI+JFFEYXRheyJOdW1iZXIifTwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJOYW1lIiwiNDAifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiQ3VyRGVwbFN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgd2lkdGg9IjE1MCI+JFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzc1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjUiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPC90YWJsZT4=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1BZGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtQWRkCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtQWRkLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCIgbmFtZT0iY29uZmlnaXRlbWNsYXNzIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUmVkaXJlY3QiPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb25maWcgSXRlbSJ9ICRUZXh0eyJDbGFzcyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJDbGFzcyJ9OgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VsZWN0In0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCx2IDEuMyAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkVkaXQifTogJFRleHR7IkNvbmZpZyBJdGVtIn06ICRRRGF0YXsiTnVtYmVyIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JFFEYXRheyJDb25maWdJdGVtSUQifSIgb25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWZXJzaW9uU2F2ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiRRRGF0YXsiQ2xhc3NJRCJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb25maWdJdGVtSUQiIHZhbHVlPSIkUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTglIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTclIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjExJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvd05hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlRoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5hbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iTmFtZSIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iPgo8IS0tIGR0bDpibG9jazpSb3dOYW1lSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dOYW1lSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvd05hbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlJvd0RlcGxTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIxIiBjb2xvcj0iI0JCQkJCQiIgbm9zaGFkZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZXBsU3RhdGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6Um93RGVwbFN0YXRlSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dEZXBsU3RhdGVJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93RGVwbFN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpSb3dJbmNpU3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlRoZSBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJJbmNpZGVudCBTdGF0ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbmNpU3RhdGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6Um93SW5jaVN0YXRlSW52YWxpZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IkludmFsaWQifSIgc2l6ZT0iLTIiPiombmJzcDskVGV4dHsiaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpSb3dJbmNpU3RhdGVJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93SW5jaVN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZVJ1bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlU3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlU3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+PGhyIHdpZHRoPSIxMDAlIiBzaXplPSIxIiBjb2xvcj0iI0JCQkJCQiIgbm9zaGFkZT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVSdWxlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJOYW1lIn0ifToKPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250Pgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW5wdXRTdHJpbmcifQo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnRJbnZhbGlkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiSW52YWxpZCJ9IiBzaXplPSItMiI+KiZuYnNwOyRUZXh0eyJpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudEludmFsaWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudERlbGV0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJFFEYXRheyJJbnB1dEtleSJ9OjpEZWxldGUiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnREZWxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudERlbGV0ZUR1bW15IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50RGVsZXRlRHVtbXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGQgLS0+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZFJ1bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkUnVsZVNwYWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPiZuYnNwOzwvdGQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZFJ1bGVTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij48aHIgd2lkdGg9IjEwMCUiIHNpemU9IjEiIGNvbG9yPSIjQkJCQkJCIiBub3NoYWRlPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRSdWxlIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRDb250ZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZENvbnRlbnRTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4mbmJzcDs8L3RkPgo8IS0tIGR0bDpibG9jazpYTUxSb3dBZGRDb250ZW50U3BhY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSIkUURhdGF7IklucHV0S2V5In06OkFkZCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkQ29udGVudCAtLT4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjYiPjxociB3aWR0aD0iMTAwJSIgc2l6ZT0iMSIgY29sb3I9IiNCQkJCQkIiIG5vc2hhZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0U2F2ZSIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1IaXN0b3J5LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgaGlzdG9yeQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ29uZmlnSXRlbUhpc3RvcnkuZHRsLHYgMS4yIDIwMDkvMDgvMjAgMTQ6MjU6MTkgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIHN0YXJ0IGZvcm0gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiSGlzdG9yeSBvZiJ9IENvbmZpZyBJdGVtOiAkRGF0YXsiTmFtZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbSZDb25maWdJdGVtSUQ9JERhdGF7IkNvbmZpZ0l0ZW1JRCJ9JlZlcnNpb25JRD0kRGF0YXsiVmVyc2lvbklEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiQWN0aW9uIn06CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiQ29tbWVudCJ9OgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBXSURUSD0iNjAiIEFMSUdOPSJDRU5URVIiPgogICAgICAgICAgICAkVGV4dHsiWm9vbSJ9OgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJFRleHR7IlVzZXIifToKICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJDcmVhdGV0aW1lIn06CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KIyBzaG91bGQgaSBzaG93ICB0aGUgem9vbSBsaW5rPwogICAgICAgIDxkdGwgc2V0ICREYXRheyJMaW5rIn0gPSAiIj4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiVmVyc2lvbklEIn0gbmUgIjAiKSB7ICREYXRheyJMaW5rIn0gPSAiJlZlcnNpb25JRD0kRGF0YXsiVmVyc2lvbklEIn0iOyB9PgogICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJjc3MifSI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRRdW90ZXsiJERhdGF7Ikhpc3RvcnlUeXBlIn0ifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDb21tZW50In0iPiRRRGF0YXsiQ29tbWVudCIsIjEwMCJ9PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJDRU5URVIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kRGF0YXsiQ29uZmlnSXRlbUlEIn0kRGF0YXsiTGluayJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiWm9vbSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+eDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9ICgkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSkifSI+CiAgICAgICAgICAgICRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIyMCJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+Cg==
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5kdGwgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1QcmludC5kdGwsdiAxLjIgMjAwOS8wNS8xOCAxMDowMToxOCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFRleHR7IkNvbmZpZ0l0ZW0ifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJDb25maWdJdGVtLUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2xhc3MifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb25maWdJdGVtIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkN1cnJlbnROYW1lIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDcmVhdGVCeVVzZXJMb2dpbiJ9ICgkUURhdGF7IkNyZWF0ZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ3JlYXRlQnlVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDdXJEZXBsU3RhdGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3VycmVudCBJbmNpZGVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2hhbmdlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDaGFuZ2VCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNoYW5nZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJMaW5rZWQtT2JqZWN0In06CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZSAtLT4KICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiJERhdGF7IkxpbmtUeXBlTmFtZSJ9In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICREYXRheyJMaW5rU3RyZyJ9PGJyPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZVJvdyAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlZlcnNpb24gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgJFRleHR7IlZlcnNpb24ifSZuYnNwOyRRRGF0YXsiVmVyc2lvbk51bWJlciJ9CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ3JlYXRlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDcmVhdGVCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNyZWF0ZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiRGVwbFN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmNpZGVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiSW5jaVN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgo8IS0tIGR0bDpibG9jazpWZXJzaW9uUm93TmFtZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dOYW1lUHJlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJOYW1lIn0ifTombmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dWYWx1ZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOlZlcnNpb25Sb3dWYWx1ZVByZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0KICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6VmVyc2lvbiAtLT4K
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2guZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoLmR0bCx2IDEuMiAyMDA5LzA1LzE4IDEwOjAxOjE4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJFRleHR7IkNvbmZpZyBJdGVtIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiIG5hbWU9ImNvbmZpZ2l0ZW1jbGFzcyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkF0dHJpYnV0ZSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbmZpZyBJdGVtIn0gJFRleHR7IkNsYXNzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNsYXNzIn06CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ2xhc3NPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDbGFzcyAtLT4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNlYXJjaCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaFJlc3VsdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiREYXRheyJDbGFzc0lEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiQ2xhc3MifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJOdW1iZXIiIHNpemU9IjgwIiBtYXhsZW5ndGg9IjI1MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iTmFtZSIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjUwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVwbG95bWVudCBTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluY2lkZW50IFN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDdXJJbmNpU3RhdGVPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlUm93IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06PC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW5wdXRTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRyaWJ1dGVSb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWxzbyBzZWFyY2ggaW4gcHJldmlvdXMgdmVyc2lvbnM/In08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByZXZpb3VzVmVyc2lvbk9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6QXR0cmlidXRlIC0tPgo=
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hSZXN1bHQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoUmVzdWx0LmR0bCx2IDEuMyAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25maWcgSXRlbSJ9ICRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCkiPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJUb3RhbCBoaXRzIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTnVtYmVyIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRlcGxveW1lbnQgU3RhdGUifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0iPiRRRGF0YXsiTnVtYmVyIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAkUURhdGF7Ik5hbWUiLCI0MCJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJDdXJEZXBsU3RhdGUifSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+
IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLmR0bCx2IDEuMyAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifSAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUFjdGl2ZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCIgdmFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkluY2lTaWduYWwifS1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJJbmNpU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDt8LS0mZ3Q7Jmd0OyZndDsmbmJzcDsKICAgICAgICAgICAgICAgICAgPGk+CiAgICAgICAgICAgICAgICAgIDxiPgogICAgICAgICAgICAgICAgICA8dT4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJDb3VudCJ9LgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tJkNvbmZpZ0l0ZW1JRD0kUURhdGF7IkNvbmZpZ0l0ZW1JRCJ9JlZlcnNpb25JRD0kUURhdGF7IlZlcnNpb25JRCJ9JlNob3dWZXJzaW9ucz0kUURhdGF7IlNob3dWZXJzaW9ucyJ9Ij4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0gKCRUZXh0eyIkUURhdGF7IkRlcGxTdGF0ZSJ9In0pCiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIzMCJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMzAifSkgLSAkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgICAgICAgICAgPC91PgogICAgICAgICAgICAgICAgICA8L2I+CiAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQWN0aXZlIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUluYWN0aXZlIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiB2YWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiSW5jaVNpZ25hbCJ9LXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkluY2lTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiSW5jaVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwO3wtLSZndDsmbmJzcDskUURhdGF7IkNvdW50In0uCiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb20mQ29uZmlnSXRlbUlEPSRRRGF0YXsiQ29uZmlnSXRlbUlEIn0mVmVyc2lvbklEPSRRRGF0YXsiVmVyc2lvbklEIn0mU2hvd1ZlcnNpb25zPSRRRGF0YXsiU2hvd1ZlcnNpb25zIn0iPgogICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifSAoJFRleHR7IiRRRGF0YXsiRGVwbFN0YXRlIn0ifSkKICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjMwIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIzMCJ9KSAtICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVUaW1lIn0ifQogICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1JbmFjdGl2ZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW0gLS0+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgIDxociBzaXplPSIyIj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkRhdGEgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjUlIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4KPCEtLSBkdGw6YmxvY2s6RGF0YU5hbWVQcmUgLS0+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwo8IS0tIGR0bDpibG9jazpEYXRhTmFtZVByZSAtLT4KICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTmFtZSJ9In06Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6RGF0YVZhbHVlUHJlIC0tPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6RGF0YVZhbHVlUHJlIC0tPgogICAgICAgICAgICAkRGF0YXsiVmFsdWUifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpEYXRhIC0tPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVDb21wbGV4IC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICREYXRheyJMaW5rVGFibGVTdHJnIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjUlIiB2YWxpZ249InRvcCIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZXRhIC0tPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkNsYXNzIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPiRRRGF0YXsiQ2xhc3MiLCIyNSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJOYW1lIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiTmFtZSJ9Ij4kUURhdGF7Ik5hbWUiLCIyNSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIn06IDwvYj48L3RkPgogICAgICAgICAgPHRkPiRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJEZXBsU3RhdGUifSJ9IiwiMjUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUifTogPC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgJFF1b3RleyIkVGV4dHsiJERhdGF7IkN1ckluY2lTdGF0ZSJ9In0iLCIyNSJ9Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJDdXJJbmNpU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJDdXJJbmNpU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDcmVhdGVVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvSVRTTUNvbmZpZ0l0ZW0ucG0gLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIElUU01Db25maWdJdGVtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuNiAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbSAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgSVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyB0byBpbXBvcnQgYW5kIGV4cG9ydCBJVFNNIGNvbmZpZyBpdGVtcwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIEltcG9ydEV4cG9ydE9iamVjdCA9PiAkSW1wb3J0RXhwb3J0T2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgSW1wb3J0RXhwb3J0T2JqZWN0KSkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBvYmplY3QgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRPYmplY3RCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKSB8fCB7fTsKCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb3VudE1heCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJzEwJywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVnZXggICAgICAgID0+IHFyeyBcQSBcZCsgXHogfXhtcywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gNSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgbWFwcGluZyBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJE9iamVjdEJhY2tlbmQtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhOwogICAgcmV0dXJuIFtdIGlmIHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCc7CiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhLT57Q2xhc3NJRH07CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbjsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24gbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9OwogICAgcmV0dXJuIFtdIGlmIHJlZiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9IG5lICdBUlJBWSc7CgogICAgbXkgJEVsZW1lbnRMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIFZhbHVlID0+ICdOdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnTmFtZScsCiAgICAgICAgICAgIFZhbHVlID0+ICdOYW1lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgIFZhbHVlID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgIFZhbHVlID0+ICdJbmNpZGVudCBTdGF0ZScsCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgeG1sIGVsZW1lbnRzCiAgICAkU2VsZi0+X01hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICBFbGVtZW50TGlzdCAgID0+ICRFbGVtZW50TGlzdCwKICAgICAgICBDb3VudE1heCAgICAgID0+ICRPYmplY3REYXRhLT57Q291bnRNYXh9IHx8IDEwLAogICAgKTsKCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdLZXknLAogICAgICAgICAgICBOYW1lICA9PiAnS2V5JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRFbGVtZW50TGlzdCwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBOYW1lICA9PiAnSWRlbnRpZmllcicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIF9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpyZWN1c2lvbiBmdW5jdGlvbiBmb3IgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKICAgICRPYmplY3RCYWNrZW5kLT5fTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgRWxlbWVudExpc3QgICA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte0NvdW50TWF4fTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17RWxlbWVudExpc3R9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0VsZW1lbnRMaXN0fSBuZSAnQVJSQVknOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgbXkgJENvdW50TWF4ID0gJEl0ZW0tPntDb3VudE1heH0gPiAkUGFyYW17Q291bnRNYXh9ID8gJFBhcmFte0NvdW50TWF4fSA6ICRJdGVtLT57Q291bnRNYXh9OwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ291bnRNYXggKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBrZXkgc3RyaW5nCiAgICAgICAgICAgIG15ICRLZXkgPSAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50OwoKICAgICAgICAgICAgIyBhZGQgcHJlZml4IHRvIGtleQogICAgICAgICAgICBpZiAoICRQYXJhbXtLZXlQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJEtleSA9ICRQYXJhbXtLZXlQcmVmaXh9IC4gJzo6JyAuICRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIHZhbHVlIHN0cmluZwogICAgICAgICAgICBteSAkVmFsdWUgPSAkSXRlbS0+e0tleX07CgogICAgICAgICAgICAjIGFkZCBjb3VudCBpZiByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRDb3VudE1heCA+IDEgfHwgJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgJFZhbHVlIC49ICc6OicgLiAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIHByZWZpeCB0byBrZXkKICAgICAgICAgICAgaWYgKCAkUGFyYW17VmFsdWVQcmVmaXh9ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlUHJlZml4fSAuICc6OicgLiAkVmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIHJvdwogICAgICAgICAgICBteSAlUm93ID0gKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17RWxlbWVudExpc3R9IH0sIFwlUm93OwoKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAgICAgJFNlbGYtPl9NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgRWxlbWVudExpc3QgICA9PiAkUGFyYW17RWxlbWVudExpc3R9LAogICAgICAgICAgICAgICAgS2V5UHJlZml4ICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWVQcmVmaXggICA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBDb3VudE1heCAgICAgID0+ICRDb3VudE1heCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkT2JqZWN0QmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhOwogICAgcmV0dXJuIFtdIGlmIHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCc7CiAgICByZXR1cm4gW10gaWYgISRPYmplY3REYXRhLT57Q2xhc3NJRH07CgogICAgIyBnZXQgZGVmaW5pdGlvbgogICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICk7CgogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbjsKICAgIHJldHVybiBbXSBpZiByZWYgJFhNTERlZmluaXRpb24gbmUgJ0hBU0gnOwogICAgcmV0dXJuIFtdIGlmICEkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9OwogICAgcmV0dXJuIFtdIGlmIHJlZiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9IG5lICdBUlJBWSc7CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICkgfHwge307CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKSB8fCB7fTsKCiAgICBteSAkQXR0cmlidXRlTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOdW1iZXInLAogICAgICAgICAgICBOYW1lICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyNTUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgTmFtZSAgPT4gJ05hbWUnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDgwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDI1NSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0RlcGxTdGF0ZUlEcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGVwbFN0YXRlTGlzdCwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA1LAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdJbmNpZGVudCBTdGF0ZScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgeG1sIGF0dHJpYnV0ZXMKICAgICRTZWxmLT5fU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgQXR0cmlidXRlTGlzdCA9PiAkQXR0cmlidXRlTGlzdCwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVMaXN0Owp9Cgo9aXRlbSBfU2VhcmNoQXR0cmlidXRlc0dldCgpCgpyZWN1c2lvbiBmdW5jdGlvbiBmb3IgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKICAgICRPYmplY3RCYWNrZW5kLT5fU2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBBdHRyaWJ1dGVMaXN0ID0+ICRBcnJheVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX1NlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtBdHRyaWJ1dGVMaXN0fTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSBuZSAnQVJSQVknOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBzZXQgcHJlZml4CiAgICAgICAgbXkgJEtleSAgPSAkSXRlbS0+e0tleX07CiAgICAgICAgbXkgJE5hbWUgPSAkSXRlbS0+e05hbWV9OwoKICAgICAgICBpZiAoICRQYXJhbXtLZXlQcmVmaXh9ICkgewogICAgICAgICAgICAkS2V5ID0gJFBhcmFte0tleVByZWZpeH0gLiAnOjonIC4gJEtleTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte05hbWVQcmVmaXh9ICkgewogICAgICAgICAgICAkTmFtZSA9ICRQYXJhbXtOYW1lUHJlZml4fSAuICc6OicgLiAkTmFtZTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZSwgaWYgbWFya2VkIGFzIHNlYXJjaGFibGUKICAgICAgICBpZiAoICRJdGVtLT57U2VhcmNoYWJsZX0gKSB7CgogICAgICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHQnIHx8ICRJdGVtLT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHRBcmVhJyApIHsKCiAgICAgICAgICAgICAgICBteSAlUm93ID0gKAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICRJdGVtLT57SW5wdXR9LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1NpemV9IHx8IDYwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggICA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e01heExlbmd0aH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0cmlidXRlTGlzdH0gfSwgXCVSb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIGxpc3QKICAgICAgICAgICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntJbnB1dH0tPntDbGFzc30sCiAgICAgICAgICAgICAgICApIHx8IHt9OwoKICAgICAgICAgICAgICAgIG15ICVSb3cgPSAoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkR2VuZXJhbENhdGFsb2dMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkSXRlbS0+e0lucHV0fS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSB9LCBcJVJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1NlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ID0+ICRQYXJhbXtBdHRyaWJ1dGVMaXN0fSwKICAgICAgICAgICAgS2V5UHJlZml4ICAgICA9PiAkS2V5LAogICAgICAgICAgICBOYW1lUHJlZml4ICAgID0+ICROYW1lLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEV4cG9ydERhdGFHZXQoKQoKZ2V0IGV4cG9ydCBkYXRhIGFzIDJELWFycmF5LWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEV4cG9ydERhdGEgPSAkT2JqZWN0QmFja2VuZC0+RXhwb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2xhc3NMaXN0IHx8IHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJE9iamVjdERhdGEtPntDbGFzc0lEfSB8fCAhJENsYXNzTGlzdC0+eyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2xhc3MgaWQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIGlmICggISRNYXBwaW5nT2JqZWN0RGF0YSB8fCByZWYgJE1hcHBpbmdPYmplY3REYXRhIG5lICdIQVNIJyApIHsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBNYXBwaW5nT2JqZWN0TGlzdCwgJE1hcHBpbmdPYmplY3REYXRhOwogICAgfQoKICAgICMgZ2V0IHNlYXJjaCBkYXRhCiAgICBteSAkU2VhcmNoRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTZWFyY2hEYXRhIHx8IHJlZiAkU2VhcmNoRGF0YSBuZSAnSEFTSCc7CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBjaGVjayBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIGlmICggISREZXBsU3RhdGVMaXN0IHx8IHJlZiAkRGVwbFN0YXRlTGlzdCBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgaWYgKCAhJEluY2lTdGF0ZUxpc3QgfHwgcmVmICRJbmNpU3RhdGVMaXN0IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBnZXQgdGhlIGdlbmVyYWwgY2F0YWxvZyBsaXN0IElUU006OkNvcmU6OkluY2lkZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24gb2YgdGhpcyBjbGFzcwogICAgbXkgJERlZmluaXRpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRPYmplY3REYXRhLT57Q2xhc3NJRH0sCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVNlYXJjaFBhcmFtczsKCiAgICAjIGFkZCBudW1iZXIgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIGlmICggJFNlYXJjaERhdGEtPntOdW1iZXJ9ICkgewogICAgICAgICRTZWFyY2hQYXJhbXN7TnVtYmVyfSA9ICRTZWFyY2hEYXRhLT57TnVtYmVyfTsKICAgICAgICBkZWxldGUgJFNlYXJjaERhdGEtPntOdW1iZXJ9OwogICAgfQoKICAgICMgYWRkIG5hbWUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIGlmICggJFNlYXJjaERhdGEtPntOYW1lfSApIHsKICAgICAgICAkU2VhcmNoUGFyYW1ze05hbWV9ID0gJFNlYXJjaERhdGEtPntOYW1lfTsKICAgICAgICBkZWxldGUgJFNlYXJjaERhdGEtPntOYW1lfTsKICAgIH0KCiAgICAjIGFkZCBkZXBsb3ltZW50IHN0YXRlIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICBpZiAoICRTZWFyY2hEYXRhLT57RGVwbFN0YXRlSURzfSApIHsKICAgICAgICBteSBARGVwbFN0YXRlSURzID0gc3BsaXQgJyMjIyMjJywgJFNlYXJjaERhdGEtPntEZXBsU3RhdGVJRHN9OwogICAgICAgICRTZWFyY2hQYXJhbXN7RGVwbFN0YXRlSURzfSA9IFxARGVwbFN0YXRlSURzOwogICAgICAgIGRlbGV0ZSAkU2VhcmNoRGF0YS0+e0RlcGxTdGF0ZUlEc307CiAgICB9CgogICAgIyBhZGQgaW5jaWRlbnQgc3RhdGUgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIGlmICggJFNlYXJjaERhdGEtPntJbmNpU3RhdGVJRHN9ICkgewogICAgICAgIG15IEBJbmNpU3RhdGVJRHMgPSBzcGxpdCAnIyMjIyMnLCAkU2VhcmNoRGF0YS0+e0luY2lTdGF0ZUlEc307CiAgICAgICAgJFNlYXJjaFBhcmFtc3tJbmNpU3RhdGVJRHN9ID0gXEBJbmNpU3RhdGVJRHM7CiAgICAgICAgZGVsZXRlICRTZWFyY2hEYXRhLT57SW5jaVN0YXRlSURzfTsKICAgIH0KCiAgICAjIGFkZCBhbGwgWE1MIGRhdGEgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgIG15IEBTZWFyY2hQYXJhbXNXaGF0OwogICAgJFNlbGYtPl9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIFdoYXQgICAgICAgICAgPT4gXEBTZWFyY2hQYXJhbXNXaGF0LAogICAgICAgIFNlYXJjaERhdGEgICAgPT4gJFNlYXJjaERhdGEsCiAgICApOwoKICAgICMgYWRkIFhNTCBzZWFyY2ggcGFyYW1zIHRvIHRoZSBzZWFyY2ggaGFzaAogICAgaWYgKEBTZWFyY2hQYXJhbXNXaGF0KSB7CiAgICAgICAgJFNlYXJjaFBhcmFtc3tXaGF0fSA9IFxAU2VhcmNoUGFyYW1zV2hhdDsKICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgY29uZmlnIGl0ZW1zCiAgICBteSAkQ29uZmlnSXRlbUxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgJVNlYXJjaFBhcmFtcywKICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IF0sCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSBARXhwb3J0RGF0YTsKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbUxpc3R9ICkgewoKICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgICAgICBteSAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJFZlcnNpb25EYXRhOwogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmIHJlZiAkVmVyc2lvbkRhdGEgbmUgJ0hBU0gnOwoKICAgICAgICAjIHRyYW5zbGF0ZSB4bWxkYXRhIHRvIGEgMmQgaGFzaAogICAgICAgIG15ICVYTUxEYXRhMkQ7CiAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbkRhdGEtPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICAgICAgWE1MRGF0YTJEICAgICA9PiBcJVhNTERhdGEyRCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBkYXRhIHRvIHRoZSBleHBvcnQgZGF0YSBhcnJheQogICAgICAgIG15IEBJdGVtOwogICAgICAgIE1BUFBJTkdPQkpFQ1Q6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0IChATWFwcGluZ09iamVjdExpc3QpIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRNYXBwaW5nT2JqZWN0LT57S2V5fTsKCiAgICAgICAgICAgICMgaGFuZGxlIGVtcHR5IGtleQogICAgICAgICAgICBpZiAoICEkS2V5ICkgewogICAgICAgICAgICAgICAgcHVzaCBASXRlbSwgJyc7CiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGNvbmZpZyBpdGVtIG51bWJlcgogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ051bWJlcicgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkVmVyc2lvbkRhdGEtPntOdW1iZXJ9OwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBjdXJyZW50IGNvbmZpZyBpdGVtIG5hbWUKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdOYW1lJyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICRWZXJzaW9uRGF0YS0+e05hbWV9OwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRlbCBkZXBsb3ltZW50IHN0YXRlCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnRGVwbFN0YXRlJyApIHsKICAgICAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSB8fD0gJ0RVTU1ZJzsKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW0sICREZXBsU3RhdGVMaXN0LT57ICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSB9OwogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRlbCBpbmNpZGVudCBzdGF0ZQogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ0luY2lTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbkRhdGEtPntJbmNpU3RhdGVJRH0gfHw9ICdEVU1NWSc7CiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtLCAkSW5jaVN0YXRlTGlzdC0+eyAkVmVyc2lvbkRhdGEtPntJbmNpU3RhdGVJRH0gfTsKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgYWxsIFhNTCBkYXRhIGVsZW1lbnRzCiAgICAgICAgICAgIHB1c2ggQEl0ZW0sICRYTUxEYXRhMkR7JEtleX07CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBFeHBvcnREYXRhLCBcQEl0ZW07CiAgICB9CgogICAgcmV0dXJuIFxARXhwb3J0RGF0YTsKfQoKPWl0ZW0gX0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKCkKCnJlY3VzaW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGV4cG9ydCBYTUwgc2VhcmNoIHBhcmFtcwoKICAgICRPYmplY3RCYWNrZW5kLT5fRXhwb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXJyYXlSZWYsCiAgICAgICAgV2hhdCAgICAgICAgICA9PiAkQXJyYXlSZWYsCiAgICAgICAgU2VhcmNoRGF0YSAgICA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17V2hhdH07CiAgICByZXR1cm4gaWYgISRQYXJhbXtTZWFyY2hEYXRhfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtXaGF0fSBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnOwoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgIyBjcmVhdGUga2V5CiAgICAgICAgbXkgJEtleSA9ICRQYXJhbXtQcmVmaXh9ID8gJFBhcmFte1ByZWZpeH0gLiAnOjonIC4gJEl0ZW0tPntLZXl9IDogJEl0ZW0tPntLZXl9OwoKICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICBteSAkVmFsdWVzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlYXJjaERhdGF9LT57JEtleX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRWYWx1ZXMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBrZXkKICAgICAgICAgICAgbXkgJFNlYXJjaEtleSA9ICRLZXk7CiAgICAgICAgICAgICRTZWFyY2hLZXkgPX4gc3sgOjogfXtcJ1x9WyVdXHtcJ314bXNnOwoKICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICAgICAgbXkgJFNlYXJjaEhhc2ggPSB7CiAgICAgICAgICAgICAgICAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkU2VhcmNoS2V5IC4gJ1wnfVslXXtcJ0NvbnRlbnRcJ30nID0+ICRWYWx1ZXMsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtXaGF0fSB9LCAkU2VhcmNoSGFzaDsKICAgICAgICB9CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIFdoYXQgICAgICAgICAgPT4gJFBhcmFte1doYXR9LAogICAgICAgICAgICBTZWFyY2hEYXRhICAgID0+ICRQYXJhbXtTZWFyY2hEYXRhfSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9FeHBvcnRYTUxEYXRhUHJlcGFyZSgpCgpyZWN1c2lvbiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBleHBvcnQgWE1MIGRhdGEKCiAgICAkT2JqZWN0QmFja2VuZC0+X0V4cG9ydFhNTERhdGFQcmVwYXJlKAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJEFycmF5UmVmLAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJEhhc2hSZWYsCiAgICAgICAgWE1MRGF0YTJEICAgICA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cG9ydFhNTERhdGFQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhMkR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGEyRH0gbmUgJ0hBU0gnOwoKICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgJFBhcmFte1ByZWZpeH0gLj0gJzo6JzsKICAgIH0KICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBzdG9wIGxvb3AsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgY3JlYXRlIGtleQogICAgICAgICAgICBteSAkS2V5ID0gJFBhcmFte1ByZWZpeH0gLiAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgJFBhcmFte1hNTERhdGEyRH0tPnskS2V5fSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTEV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAgICAgJFNlbGYtPl9FeHBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gSW1wb3J0RGF0YVNhdmUoKQoKaW1wb3J0IG9uZSByb3cgb2YgdGhlIGltcG9ydCBkYXRhCgogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgSW1wb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaW1wb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17SW1wb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ltcG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2xhc3NMaXN0IHx8IHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJE9iamVjdERhdGEtPntDbGFzc0lEfSB8fCAhJENsYXNzTGlzdC0+eyAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2xhc3MgaWQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgbXkgJUlkZW50aWZpZXI7CiAgICBteSAkQ291bnRlciA9IDA7CiAgICBNQVBQSU5HSUQ6CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgaWYgKCAhJE1hcHBpbmdPYmplY3REYXRhIHx8IHJlZiAkTWFwcGluZ09iamVjdERhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIG1hcHBpbmcgbGlzdCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQE1hcHBpbmdPYmplY3RMaXN0LCAkTWFwcGluZ09iamVjdERhdGE7CgogICAgICAgIG5leHQgTUFQUElOR0lEIGlmICEkTWFwcGluZ09iamVjdERhdGEtPntJZGVudGlmaWVyfTsKCiAgICAgICAgIyBjaGVjayBpZiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gIgogICAgICAgICAgICAgICAgICAgIC4gIickTWFwcGluZ09iamVjdERhdGEtPntLZXl9JyBoYXMgYmVlbiB1c2VkIG11bHRpcGxlIHRpbWVzIGFzIGFuIGlkZW50aWZpZXIuISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGlkZW50aWZpZXIgdmFsdWUKICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdOwoKICAgICAgICBuZXh0IE1BUFBJTkdJRCBpZiAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9ICYmICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIElkZW50aWZpZXIgZmllbGQgaXMgZW1wdHkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgY2hlY2sgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdCB8fCByZWYgJERlcGxTdGF0ZUxpc3QgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZ2VuZXJhbCBjYXRhbG9nIGxpc3QgSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXZlcnNlIHRoZSBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgIG15ICVEZXBsU3RhdGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGNoZWNrIGluY2lkZW50IHN0YXRlIGxpc3QKICAgIGlmICggISRJbmNpU3RhdGVMaXN0IHx8IHJlZiAkSW5jaVN0YXRlTGlzdCBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZ2V0IHRoZSBnZW5lcmFsIGNhdGFsb2cgbGlzdCBJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXZlcnNlIHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0CiAgICBteSAlSW5jaVN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwoKICAgICMgZ2V0IGN1cnJlbnQgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzCiAgICBteSAkRGVmaW5pdGlvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGRlZmluaXRpb24gZGF0YQogICAgaWYgKCAhJERlZmluaXRpb25EYXRhIHx8IHJlZiAkRGVmaW5pdGlvbkRhdGEgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgZGVmaW5pdGlvbiBvZiBjbGFzcyBpZCAkT2JqZWN0RGF0YS0+e0NsYXNzSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWRzICh1c2luZyB0aGUgaWRlbnRpZmllcnMpCiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgaWYgKCVJZGVudGlmaWVyKSB7CgogICAgICAgIG15ICVTZWFyY2hQYXJhbXM7CgogICAgICAgICMgYWRkIG51bWJlciB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7TnVtYmVyfSApIHsKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tOdW1iZXJ9ID0gJElkZW50aWZpZXJ7TnVtYmVyfTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye051bWJlcn07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBuYW1lIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntOYW1lfSApIHsKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc3tOYW1lfSA9ICRJZGVudGlmaWVye05hbWV9OwogICAgICAgICAgICBkZWxldGUgJElkZW50aWZpZXJ7TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBkZXBsb3ltZW50IHN0YXRlIHRvIHRoZSBzZWFyY2ggcGFyYW1zCiAgICAgICAgaWYgKCAkSWRlbnRpZmllcntEZXBsU3RhdGV9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRlcGxveW1lbnQgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJERlcGxTdGF0ZUlEID0gJERlcGxTdGF0ZUxpc3RSZXZlcnNleyAkSWRlbnRpZmllcntEZXBsU3RhdGV9IH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgZGVwbG95bWVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickSWRlbnRpZmllcntEZXBsU3RhdGV9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0RlcGxTdGF0ZUlEc30gPSBbJERlcGxTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0RlcGxTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbmNpZGVudCBzdGF0ZSB0byB0aGUgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggJElkZW50aWZpZXJ7SW5jaVN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBpbmNpZGVudCBzdGF0ZSBpZAogICAgICAgICAgICBteSAkSW5jaVN0YXRlSUQgPSAkSW5jaVN0YXRlTGlzdFJldmVyc2V7ICRJZGVudGlmaWVye0luY2lTdGF0ZX0gfSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggISRJbmNpU3RhdGVJRCApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIFRoZSBpbmNpZGVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickSWRlbnRpZmllcntJbmNpU3RhdGV9JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1ze0luY2lTdGF0ZUlEc30gPSBbJEluY2lTdGF0ZUlEXTsKICAgICAgICAgICAgZGVsZXRlICRJZGVudGlmaWVye0luY2lTdGF0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgWE1MIGRhdGEgdG8gdGhlIHNlYXJjaCBwYXJhbXMKICAgICAgICBteSBAU2VhcmNoUGFyYW1zV2hhdDsKICAgICAgICAkU2VsZi0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICBXaGF0ICAgICAgICAgID0+IFxAU2VhcmNoUGFyYW1zV2hhdCwKICAgICAgICAgICAgSWRlbnRpZmllciAgICA9PiBcJUlkZW50aWZpZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgWE1MIHNlYXJjaCBwYXJhbXMgdG8gdGhlIHNlYXJjaCBoYXNoCiAgICAgICAgaWYgKEBTZWFyY2hQYXJhbXNXaGF0KSB7CiAgICAgICAgICAgICRTZWFyY2hQYXJhbXN7V2hhdH0gPSBcQFNlYXJjaFBhcmFtc1doYXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNlYXJjaCBleGlzdGluZyBjb25maWcgaXRlbSB3aXRoIHNhbWUgaWRlbnRpZmlrYXRvcgogICAgICAgIG15ICRDb25maWdJdGVtTGlzdCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgJVNlYXJjaFBhcmFtcywKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJE9iamVjdERhdGEtPntDbGFzc0lEfSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMCwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIHNjYWxhciBAeyRDb25maWdJdGVtTGlzdH0gPiAxICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gSWRlbnRpZmllciBmaWVsZHMgTk9UIHVuaXF1ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1MaXN0LT5bMF07CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbiBkYXRhIG9mIHRoZSBjb25maWcgaXRlbQogICAgbXkgJFZlcnNpb25EYXRhID0ge307CiAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewoKICAgICAgICAjIGdldCBsYXN0IHZlcnNpb24KICAgICAgICAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBlbXB0eSB4bWwgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgISRWZXJzaW9uRGF0YS0+e1hNTERhdGF9CiAgICAgICAgICAgIHx8IHJlZiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSBuZSAnQVJSQVknCiAgICAgICAgICAgIHx8ICFAeyAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZSAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVhNTERhdGEyRDsKICAgICRDb3VudGVyID0gMDsKICAgIE1BUFBJTkdPQkpFQ1REQVRBOgogICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoQE1hcHBpbmdPYmplY3RMaXN0KSB7CgogICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEEgaWYgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnTnVtYmVyJzsKCiAgICAgICAgIyBoYW5kbGUgbmFtZQogICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e05hbWV9ID0gJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdOwogICAgICAgICAgICBuZXh0IE1BUFBJTkdPQkpFQ1REQVRBOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZGVwbG95bWVudCBzdGF0ZQogICAgICAgIGlmICggJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSBlcSAnRGVwbFN0YXRlJyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICAgICAgICAgIG15ICREZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXsgJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdIH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkRGVwbFN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgZGVwbG95bWVudCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIickUGFyYW17SW1wb3J0RGF0YVJvd30tPlskQ291bnRlcl0nIGlzIGludmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSA9ICREZXBsU3RhdGVJRDsKICAgICAgICAgICAgbmV4dCBNQVBQSU5HT0JKRUNUREFUQTsKICAgICAgICB9CgogICAgICAgICMgaGFuZGxlIGluY2lkZW50IHN0YXRlCiAgICAgICAgaWYgKCAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IGVxICdJbmNpU3RhdGUnICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGluY2lkZW50IHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRJbmNpU3RhdGVJRCA9ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXsgJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdIH0gfHwgJyc7CgogICAgICAgICAgICBpZiAoICEkSW5jaVN0YXRlSUQgKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBUaGUgaW5jaWRlbnQgc3RhdGUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICInJFBhcmFte0ltcG9ydERhdGFSb3d9LT5bJENvdW50ZXJdJyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVmVyc2lvbkRhdGEtPntJbmNpU3RhdGVJRH0gPSAkSW5jaVN0YXRlSUQ7CiAgICAgICAgICAgIG5leHQgTUFQUElOR09CSkVDVERBVEE7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSB4bWwgZGF0YQogICAgICAgICRYTUxEYXRhMkR7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSA9ICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgICMgdHJhbnNsYXRlIHhtbGRhdGEgZnJvbSAyZCBoYXNoIHRvIHRoZSBtdWx0aWRpbSBzdHJ1Y3R1cmUKICAgIG15ICRYTUxEYXRhID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgIFhNTERhdGEyRCAgICAgPT4gXCVYTUxEYXRhMkQsCiAgICApOwoKICAgICMgYWRkIFhNTCBkYXRhIHRvIHRoZSB2ZXJzaW9uIGRhdGEKICAgIGlmICggJFhNTERhdGEgJiYgcmVmICRYTUxEYXRhIGVxICdIQVNIJyAmJiAleyRYTUxEYXRhfSApIHsKICAgICAgICAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSA9ICRYTUxEYXRhOwogICAgfQoKICAgICMgYWRkIHRoZSBuZXcgY29uZmlnIGl0ZW0KICAgIG15ICROZXdDb25maWdJdGVtOwogICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKCiAgICAgICAgIyBhZGQgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJE9iamVjdERhdGEtPntDbGFzc0lEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGNvbmZpZyBpdGVtIGlkCiAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBpbXBvcnQgdGhpcyBlbnRpdHkuIEVycm9yIHdoZW4gYWRkaW5nIHRoZSBuZXcgY29uZmlnIGl0ZW0uIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJE5ld0NvbmZpZ0l0ZW0gPSAxOwogICAgfQoKICAgICMgYWRkIG5ldyB2ZXJzaW9uCiAgICBteSAkVmVyc2lvbklEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkFkZCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFZlcnNpb25EYXRhLT57TmFtZX0sCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWZpbml0aW9uRGF0YS0+e0RlZmluaXRpb25JRH0sCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICRWZXJzaW9uRGF0YS0+e0RlcGxTdGF0ZUlEfSwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJFZlcnNpb25EYXRhLT57SW5jaVN0YXRlSUR9LAogICAgICAgIFhNTERhdGEgICAgICA9PiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ29uZmlnSXRlbUlEIGlmICRWZXJzaW9uSUQ7CgogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgaW1wb3J0IHRoaXMgZW50aXR5LiBFcnJvciB3aGVuIGFkZGluZyB0aGUgbmV3IGNvbmZpZyBpdGVtIHZlcnNpb24uIiwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTmV3Q29uZmlnSXRlbTsKCiAgICAjIGRlbGV0ZSB0aGUgbmV3IGNvbmZpZyBpdGVtCiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBfSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUoKQoKcmVjdXNpb24gZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgaW1wb3J0IFhNTCBzZWFyY2ggcGFyYW1zCgogICAgJE9iamVjdEJhY2tlbmQtPl9JbXBvcnRYTUxTZWFyY2hEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBXaGF0ICAgICAgICAgID0+ICRBcnJheVJlZiwKICAgICAgICBJZGVudGlmaWVyICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfSW1wb3J0WE1MU2VhcmNoRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtXaGF0fTsKICAgIHJldHVybiBpZiAhJFBhcmFte0lkZW50aWZpZXJ9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1doYXR9IG5lICdBUlJBWSc7CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtJZGVudGlmaWVyfSBuZSAnSEFTSCc7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICAjIGNyZWF0ZSBrZXkKICAgICAgICBteSAkS2V5ID0gJFBhcmFte1ByZWZpeH0gPyAkUGFyYW17UHJlZml4fSAuICc6OlxkKzo6JyAuICRJdGVtLT57S2V5fSA6ICRJdGVtLT57S2V5fTsKICAgICAgICAkS2V5IC49ICc6OlxkKyc7CgogICAgICAgIG15ICRJZGVudGlmaWVyS2V5OwogICAgICAgIElERU5USUZJRVJLRVk6CiAgICAgICAgZm9yIG15ICRJZGVudEtleSAoIGtleXMgJXsgJFBhcmFte0lkZW50aWZpZXJ9IH0gKSB7CgogICAgICAgICAgICBuZXh0IElERU5USUZJRVJLRVkgaWYgJElkZW50S2V5ICF+IG17IFxBICRLZXkgXHogfXhtczsKCiAgICAgICAgICAgICRJZGVudGlmaWVyS2V5ID0gJElkZW50S2V5OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRJZGVudGlmaWVyS2V5KSB7CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17SWRlbnRpZmllcn0tPnskSWRlbnRpZmllcktleX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICAgICAgICAgIyBwcmVwYXJlIGtleQogICAgICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCAkSWRlbnRpZmllcktleSA9fiBteyA6OiB9eG1zICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyICUgMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElkZW50aWZpZXJLZXkgPX4gc3sgOjogfXtdXHsnfXhtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJZGVudGlmaWVyS2V5ID1+IHN7IDo6IH17J1x9W314bXM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIHNlYXJjaCBoYXNoCiAgICAgICAgICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkSWRlbnRpZmllcktleSAuICdde1wnQ29udGVudFwnfScgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtXaGF0fSB9LCAkU2VhcmNoSGFzaDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X0ltcG9ydFhNTFNlYXJjaERhdGFQcmVwYXJlKAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgV2hhdCAgICAgICAgICA9PiAkUGFyYW17V2hhdH0sCiAgICAgICAgICAgIElkZW50aWZpZXIgICAgPT4gJFBhcmFte0lkZW50aWZpZXJ9LAogICAgICAgICAgICBQcmVmaXggICAgICAgID0+ICRLZXksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ltcG9ydFhNTERhdGFQcmVwYXJlKCkKCnJlY3VzaW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIGltcG9ydCBYTUwgZGF0YQoKICAgIG15ICRYTUxEYXRhID0gJE9iamVjdEJhY2tlbmQtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBcnJheVJlZiwKICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfSW1wb3J0WE1MRGF0YVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGVmaW5pdGlvbn07CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEYXRhMkR9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERhdGEyRH0gbmUgJ0hBU0gnOwoKICAgIG15ICRYTUxEYXRhID0gKCk7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkKICAgICAgICAgICAgbXkgJEtleSA9ICRJdGVtLT57S2V5fSAuICc6OicgLiAkQ291bnRlcjsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJlZml4fSApIHsKICAgICAgICAgICAgICAgICRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByZXBhcmUgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+WE1MSW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YTJEfS0+eyRLZXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoICRJdGVtLT57U3VifSApIHsKICAgICAgICAgICAgICAgIG15ICRTdWJYTUxEYXRhID0gJFNlbGYtPl9JbXBvcnRYTUxEYXRhUHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhMkQgICAgID0+ICRQYXJhbXtYTUxEYXRhMkR9LAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFhNTERhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0gPSAkU3ViWE1MRGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRYTUxEYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH0gPSAkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRYTUxEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0ucG0gLSBhbGwgY29uZmlnIGl0ZW0gZnVuY3Rpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtLnBtLHYgMS4xOCAyMDA5LzA4LzI0IDExOjA1OjU1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkRlZmluaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Okhpc3Rvcnk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOCAkKSBbMV07CgpASVNBID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtIC0gY29uZmlnIGl0ZW0gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjb25maWcgaXRlbSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntYTUxPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb25maWdJdGVtQ291bnQoKQoKY291bnQgYWxsIHJlY29yZHMgb2YgYSBjb25maWcgaXRlbSBjbGFzcwoKICAgIG15ICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Db3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhJXskU3RhdGVMaXN0fTsKCiAgICAjIGNyZWF0ZSBzdGF0ZSBzdHJpbmcKICAgIG15ICREZXBsU3RhdGVTdHJpbmcgPSBqb2luIHF7LCB9LCBrZXlzICV7JFN0YXRlTGlzdH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgY2xhc3NfaWQgPSA/IEFORCAiCiAgICAgICAgICAgIC4gImN1cl9kZXBsX3N0YXRlX2lkIElOICggJERlcGxTdGF0ZVN0cmluZyApIiwKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb3VudCA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb3VudCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWl0ZW0gQ29uZmlnSXRlbVJlc3VsdExpc3QoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gbGlzdCBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtUmVzdWx0TGlzdCgKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICAgICBTdGFydCAgID0+IDEwMCwKICAgICAgICBMaW1pdCAgID0+IDUwLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtUmVzdWx0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgKTsKCiAgICAjIGNyZWF0ZSBzdGF0ZSBzdHJpbmcKICAgIG15ICREZXBsU3RhdGVTdHJpbmcgPSBqb2luIHF7LCB9LCBrZXlzICV7JFN0YXRlTGlzdH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSAiCiAgICAgICAgICAgIC4gIldIRVJFIGNsYXNzX2lkID0gPyBBTkQgY3VyX2RlcGxfc3RhdGVfaWQgSU4gKCAkRGVwbFN0YXRlU3RyaW5nICkgIgogICAgICAgICAgICAuICJPUkRFUiBCWSBjaGFuZ2VfdGltZSBERVNDIiwKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICAgICBTdGFydCA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENvbmZpZ0l0ZW1JRExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRExpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBnZXQgbGFzdCB2ZXJzaW9ucyBkYXRhCiAgICBteSBAQ29uZmlnSXRlbUxpc3Q7CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRExpc3QpIHsKCiAgICAgICAgIyBnZXQgdmVyc2lvbiBkYXRhCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJExhc3RWZXJzaW9uOwogICAgfQoKICAgIHJldHVybiBcQENvbmZpZ0l0ZW1MaXN0Owp9Cgo9aXRlbSBDb25maWdJdGVtR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGFzIGhhc2ggcmVmZXJlbmNlCgpSZXR1cm4KICAgICRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0KICAgICRDb25maWdJdGVte051bWJlcn0KICAgICRDb25maWdJdGVte0NsYXNzSUR9CiAgICAkQ29uZmlnSXRlbXtDbGFzc30KICAgICRDb25maWdJdGVte0xhc3RWZXJzaW9uSUR9CiAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZX0KICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZVR5cGV9CiAgICAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZX0KICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZVR5cGV9CiAgICAkQ29uZmlnSXRlbXtDcmVhdGVUaW1lfQogICAgJENvbmZpZ0l0ZW17Q3JlYXRlQnl9CiAgICAkQ29uZmlnSXRlbXtDaGFuZ2VUaW1lfQogICAgJENvbmZpZ0l0ZW17Q2hhbmdlQnl9CgogICAgbXkgJENvbmZpZ0l0ZW1SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIENhY2hlICAgICAgICA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZW5hYmxlIGNhY2hlIHBlciBkZWZhdWx0CiAgICAkUGFyYW17Q2FjaGV9ID0gIWRlZmluZWQgJFBhcmFte0NhY2hlfSA/IDEgOiAwOwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtR2V0fS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgaWYgJFBhcmFte0NhY2hlfSAmJiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1HZXR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25maWdpdGVtX251bWJlciwgY2xhc3NfaWQsIGxhc3RfdmVyc2lvbl9pZCwgJwogICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCwgY3VyX2luY2lfc3RhdGVfaWQsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlQ29uZmlnSXRlbTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfSAgID0gJFJvd1swXTsKICAgICAgICAkQ29uZmlnSXRlbXtOdW1iZXJ9ICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRDb25maWdJdGVte0NsYXNzSUR9ICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJENvbmZpZ0l0ZW17TGFzdFZlcnNpb25JRH0gID0gJFJvd1szXTsKICAgICAgICAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0gPSAkUm93WzRdOwogICAgICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZUlEfSA9ICRSb3dbNV07CiAgICAgICAgJENvbmZpZ0l0ZW17Q3JlYXRlVGltZX0gICAgID0gJFJvd1s2XTsKICAgICAgICAkQ29uZmlnSXRlbXtDcmVhdGVCeX0gICAgICAgPSAkUm93WzddOwogICAgICAgICRDb25maWdJdGVte0NoYW5nZVRpbWV9ICAgICA9ICRSb3dbOF07CiAgICAgICAgJENvbmZpZ0l0ZW17Q2hhbmdlQnl9ICAgICAgID0gJFJvd1s5XTsKICAgIH0KCiAgICAjIGNoZWNrIGNvbmZpZyBpdGVtCiAgICBpZiAoICEkQ29uZmlnSXRlbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBDb25maWdJdGVtSUQgKCRQYXJhbXtDb25maWdJdGVtSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgJENvbmZpZ0l0ZW17Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbXtDbGFzc0lEfSB9OwoKICAgIHJldHVybiBcJUNvbmZpZ0l0ZW0gaWYgISRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfSB8fCAhJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9OwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJERlcGxTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbXtDdXJEZXBsU3RhdGVJRH0sCiAgICApOwoKICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZX0gICAgID0gJERlcGxTdGF0ZS0+e05hbWV9OwogICAgJENvbmZpZ0l0ZW17Q3VyRGVwbFN0YXRlVHlwZX0gPSAkRGVwbFN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJEluY2lTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbXtDdXJJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRDb25maWdJdGVte0N1ckluY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlVHlwZX0gPSAkSW5jaVN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBjYWNoZSB1c2VyIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtR2V0fS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9ID0gXCVDb25maWdJdGVtOwoKICAgIHJldHVybiBcJUNvbmZpZ0l0ZW07Cn0KCj1pdGVtIENvbmZpZ0l0ZW1BZGQoKQoKYWRkIGEgbmV3IGNvbmZpZyBpdGVtCgogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgIE51bWJlciAgPT4gJzExMScsICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2xhc3NMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJENsYXNzTGlzdC0+eyAkUGFyYW17Q2xhc3NJRH0gfSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyB2YWxpZCBjbGFzcyBpZCBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGNvbmZpZyBpdGVtIG51bWJlcgogICAgaWYgKCAkUGFyYW17TnVtYmVyfSApIHsKCiAgICAgICAgIyBmaW5kIGV4aXN0aW5nIGNvbmZpZyBpdGVtIG51bWJlcgogICAgICAgIG15ICRFeGlzdHMgPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAkUGFyYW17TnVtYmVyfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJEV4aXN0cykgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29uZmlnIGl0ZW0gbnVtYmVyIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgJFBhcmFte051bWJlcn0gPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckNyZWF0ZSgKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyBjb25maWcgaXRlbQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtICcKICAgICAgICAgICAgLiAnKGNvbmZpZ2l0ZW1fbnVtYmVyLCBjbGFzc19pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBmaW5kIGlkIG9mIG5ldyBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgJwogICAgICAgICAgICAuICdjb25maWdpdGVtX251bWJlciA9ID8gQU5EIGNsYXNzX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtOdW1iZXJ9LCBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZmlnSXRlbUNyZWF0ZQogICAgJFNlbGYtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIEV2ZW50ICAgICAgICA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENvbW1lbnQgICAgICA9PiAkQ29uZmlnSXRlbUlEIC4gJyUlJyAuICRQYXJhbXtOdW1iZXJ9LAogICAgKTsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbURlbGV0ZSgpCgpkZWxldGUgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgdmVyc2lvbnMKICAgICRTZWxmLT5WZXJzaW9uRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgKTsKCiAgICAjIHRyaWdnZXIgQ29uZmlnSXRlbURlbGV0ZSBldmVudAogICAgJFNlbGYtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBFdmVudCAgICAgICAgPT4gJ0NvbmZpZ0l0ZW1EZWxldGUnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDb21tZW50ICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYW4gYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgIE51bWJlciAgICAgICA9PiAnVGhlIENvbmZpZ0l0ZW0gTnVtYmVyJywgICMgKG9wdGlvbmFsKQogICAgICAgIE5hbWUgICAgICAgICA9PiAnVGhlIE5hbWUnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzSURzICAgICA9PiBbOSwgOCwgNywgNl0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAjIChvcHRpb25hbCkKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY2hhbmdlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICMgKG9wdGlvbmFsKQogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY2hhbmdlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAjIChvcHRpb25hbCkKCiAgICAgICAgV2hhdCA9PiBbCiAgICAgICAgICAgICMgZWFjaCBhcnJheSBlbGVtZW50IGlzIGEgYW5kIGNvbmRpdGlvbgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIG9yIGNvbmRpdGlvbiBpbiBoYXNoCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEElJywKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+ICclY29udGVudEIlJywKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRDJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgdXNlIGFycmF5IHJlZmVyZW5jZSBpZiBkaWZmZXJlbnQgY29udGVudCB3aXRoIHNhbWUga2V5IHdhcyBzZWFyY2hlZAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEInfVslXXsnQ29udGVudCd9IiA9PiBbJyVjb250ZW50QyUnLCAnJWNvbnRlbnREJScsICclY29udGVudEUlJ10sCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+IFsnJWNvbnRlbnRDJScsICclY29udGVudEQlJywgJyVjb250ZW50RSUnXSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAoKICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkKCiAgICAgICAgT3JkZXJCeSA9PiAnTnVtYmVyJywgICMgKG9wdGlvbmFsKSBkZWZhdWx0IENvbmZpZ0l0ZW1JRAogICAgICAgICMgKENvbmZpZ0l0ZW1JRCwgTnVtYmVyLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQsCiAgICAgICAgIyBDcmVhdGVUaW1lLCBDcmVhdGVCeSwgQ2hhbmdlVGltZSwgQ2hhbmdlQnkpCgogICAgICAgIExpbWl0ICAgICAgICAgID0+IDEyMiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbGltaXQKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH07CiAgICAkUGFyYW17TGltaXR9ID0gdW5kZWY7CgogICAgIyBjb25maWcgaXRlbSBzZWFyY2ggaXMgcmVxdWlyZWQgaWYgb25lIG9mIHRoaXMgcGFyYW1zIGFyZSBnaXZlbgogICAgbXkgQENvbmZpZ0l0ZW1TZWFyY2hQYXJhbXMgPSAoCiAgICAgICAgJ051bWJlcicsCiAgICAgICAgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAnQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICdDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlJwogICAgKTsKCiAgICAjIGNoZWNrLCBpZiBjb25maWcgaXRlbSBzZWFyY2ggaXMgcmVxdWlyZWQKICAgIG15ICVSZXF1aXJlZFNlYXJjaDsKICAgIENPTkZJR0lURU1QQVJBTToKICAgIGZvciBteSAkQ29uZmlnSXRlbVBhcmFtIChAQ29uZmlnSXRlbVNlYXJjaFBhcmFtcykgewogICAgICAgIG5leHQgQ09ORklHSVRFTVBBUkFNIGlmICEkUGFyYW17JENvbmZpZ0l0ZW1QYXJhbX07CgogICAgICAgICRSZXF1aXJlZFNlYXJjaHtDb25maWdJdGVtfSA9IDE7CiAgICAgICAgbGFzdCBDT05GSUdJVEVNUEFSQU07CiAgICB9CgogICAgIyB2ZXJzaW9uIHNlYXJjaCBpcyByZXF1aXJlZCBpZiBOYW1lLCBXaGF0IG9yIFByZXZpb3VzVmVyc2lvblNlYXJjaCBpcyBnaXZlbgogICAgaWYgKCAkUGFyYW17TmFtZX0gfHwgJFBhcmFte1doYXR9IHx8ICRQYXJhbXtQcmV2aW91c1ZlcnNpb25TZWFyY2h9ICkgewogICAgICAgICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSA9IDE7CiAgICB9CgogICAgIyB4bWwgdmVyc2lvbiBzZWFyY2ggaXMgcmVxdWlyZWQgaWYgV2hhdCBpcyBnaXZlbgogICAgaWYgKCAkUGFyYW17V2hhdH0gKSB7CiAgICAgICAgJFJlcXVpcmVkU2VhcmNoe1hNTFZlcnNpb259ID0gMTsKICAgIH0KCiAgICAjIHVzZSBjb25maWcgaXRlbSBzZWFyY2ggYXMgZmFsbGJhY2sKICAgIGlmICggISVSZXF1aXJlZFNlYXJjaCApIHsKICAgICAgICAkUmVxdWlyZWRTZWFyY2h7Q29uZmlnSXRlbX0gPSAxOwogICAgfQoKICAgICMgc3RhcnQgY29uZmlnIGl0ZW0gc2VhcmNoCiAgICBteSAlQ29uZmlnSXRlbUxpc3RzOwogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7Q29uZmlnSXRlbX0gKSB7CgogICAgICAgICMgc2VhcmNoIGNvbmZpZyBpdGVtcwogICAgICAgICRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX0gPSAkU2VsZi0+Q29uZmlnSXRlbVNlYXJjaCglUGFyYW0pOwoKICAgICAgICByZXR1cm4gaWYgISRDb25maWdJdGVtTGlzdHN7Q29uZmlnSXRlbX07CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19IG5lICdBUlJBWSc7CiAgICAgICAgcmV0dXJuIFtdIGlmICFAeyAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19IH07CiAgICB9CgogICAgIyBzdGFydCB2ZXJzaW9uIHNlYXJjaAogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7VmVyc2lvbn0gKSB7CgogICAgICAgICMgc2VhcmNoIHZlcnNpb25zCiAgICAgICAgJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufSA9ICRTZWxmLT5WZXJzaW9uU2VhcmNoKCVQYXJhbSk7CgogICAgICAgIHJldHVybiBpZiAhJENvbmZpZ0l0ZW1MaXN0c3tWZXJzaW9ufTsKICAgICAgICByZXR1cm4gaWYgcmVmICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gbmUgJ0FSUkFZJzsKICAgICAgICByZXR1cm4gW10gaWYgIUB7ICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gfTsKICAgIH0KCiAgICAjIHN0YXJ0IHhtbCB2ZXJzaW9uIHNlYXJjaAogICAgaWYgKCAkUmVxdWlyZWRTZWFyY2h7WE1MVmVyc2lvbn0gKSB7CgogICAgICAgICMgc2VhcmNoIHhtbCB2ZXJzaW9ucwogICAgICAgIG15ICRYTUxWZXJzaW9uTGlzdCA9ICRTZWxmLT5fWE1MVmVyc2lvblNlYXJjaCglUGFyYW0pOwoKICAgICAgICByZXR1cm4gaWYgISRYTUxWZXJzaW9uTGlzdDsKICAgICAgICByZXR1cm4gaWYgcmVmICRYTUxWZXJzaW9uTGlzdCBuZSAnSEFTSCc7CiAgICAgICAgcmV0dXJuIFtdIGlmICEleyRYTUxWZXJzaW9uTGlzdH07CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGlkcwogICAgICAgIG15ICVDb25maWdJdGVtTGlzdFRtcDsKICAgICAgICBmb3IgbXkgJFZlcnNpb25JRCAoIGtleXMgJXskWE1MVmVyc2lvbkxpc3R9ICkgewogICAgICAgICAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPlZlcnNpb25Db25maWdJdGVtSURHZXQoCiAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJFZlcnNpb25JRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1MaXN0VG1weyRDb25maWdJdGVtSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGlkcyB0byBjb25maWcgaXRlbSBsaXN0CiAgICAgICAgJENvbmZpZ0l0ZW1MaXN0c3tYTUxWZXJzaW9ufSA9IFwlQ29uZmlnSXRlbUxpc3RUbXA7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHJlc3VsdCBsaXN0CiAgICBteSBAUmVzdWx0TGlzdDsKICAgIGlmICggJFJlcXVpcmVkU2VhcmNoe0NvbmZpZ0l0ZW19ICYmICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSApIHsKCiAgICAgICAgbXkgJVZlcnNpb25UZW1wTGlzdDsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7ICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gfSApIHsKICAgICAgICAgICAgJFZlcnNpb25UZW1wTGlzdHskQ29uZmlnSXRlbUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19IH0gKSB7CgogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJFZlcnNpb25UZW1wTGlzdHskQ29uZmlnSXRlbUlEfTsKCiAgICAgICAgICAgIHB1c2ggQFJlc3VsdExpc3QsICRDb25maWdJdGVtSUQ7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUmVxdWlyZWRTZWFyY2h7Q29uZmlnSXRlbX0gKSB7CiAgICAgICAgQFJlc3VsdExpc3QgPSBAeyAkQ29uZmlnSXRlbUxpc3Rze0NvbmZpZ0l0ZW19IH07CiAgICB9CiAgICBlbHNpZiAoICRSZXF1aXJlZFNlYXJjaHtWZXJzaW9ufSApIHsKICAgICAgICBAUmVzdWx0TGlzdCA9IEB7ICRDb25maWdJdGVtTGlzdHN7VmVyc2lvbn0gfTsKICAgIH0KCiAgICAjIGNvbnNpZGVyIHRoZSBYTUwgcmVzdWx0CiAgICBpZiAoICRSZXF1aXJlZFNlYXJjaHtYTUxWZXJzaW9ufSApIHsKICAgICAgICBAUmVzdWx0TGlzdCA9IGdyZXAgeyAkQ29uZmlnSXRlbUxpc3Rze1hNTFZlcnNpb259LT57JF99IH0gQFJlc3VsdExpc3Q7CiAgICB9CgogICAgIyBjb25zaWRlciBsaW1pdAogICAgaWYgKCAkTGltaXQgJiYgJExpbWl0IDwgc2NhbGFyIEBSZXN1bHRMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgdGhlIGxpbWl0ZWQgaWRzCiAgICAgICAgJExpbWl0LS07CiAgICAgICAgQFJlc3VsdExpc3QgPSBAUmVzdWx0TGlzdFsgMCAuLiAkTGltaXQgXTsKICAgIH0KCiAgICByZXR1cm4gXEBSZXN1bHRMaXN0Owp9Cgo9aXRlbSBDb25maWdJdGVtU2VhcmNoKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYW4gYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBOdW1iZXIgICAgICAgPT4gJ1RoZSBDb25maWdJdGVtIE51bWJlcicsICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWzksIDgsIDcsIDZdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDcmVhdGVCeSAgICAgPT4gWzEsIDIsIDNdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgPT4gWzMsIDIsIDFdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAjIChvcHRpb25hbCkKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgIyAob3B0aW9uYWwpCgogICAgICAgIE9yZGVyQnkgPT4gJ051bWJlcicsICAjIChvcHRpb25hbCkgZGVmYXVsdCBDb25maWdJdGVtSUQKICAgICAgICAjIChDb25maWdJdGVtSUQsIE51bWJlciwgQ2xhc3NJRCwgRGVwbFN0YXRlSUQsIEluY2lTdGF0ZUlELAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICBMaW1pdCAgICAgICAgICA9PiAxMjIsICAjIChvcHRpb25hbCkKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQogICAgJFBhcmFte09yZGVyQnl9IHx8PSAnaWQnOwoKICAgICMgYWRkIG51bWJlciB0byBzcWwgd2hlcmUgYXJyYXkKICAgIG15IEBTUUxXaGVyZTsKICAgIGlmICggJFBhcmFte051bWJlcn0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte051bWJlcn0gKTsKCiAgICAgICAgaWYgKCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewoKICAgICAgICAgICAgIyBwcmVwYXJlIGxpa2Ugc3RyaW5nCiAgICAgICAgICAgICRTZWxmLT5fUHJlcGFyZUxpa2VTdHJpbmcoIFwkUGFyYW17TnVtYmVyfSApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJMT1dFUihjb25maWdpdGVtX251bWJlcikgTElLRSBMT1dFUignJFBhcmFte051bWJlcn0nKSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKGNvbmZpZ2l0ZW1fbnVtYmVyKSA9IExPV0VSKCckUGFyYW17TnVtYmVyfScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2xhc3NJRHMgICAgID0+ICdjbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSURzID0+ICdjdXJfZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgSW5jaVN0YXRlSURzID0+ICdjdXJfaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgQ3JlYXRlQnkgICAgID0+ICdjcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ICAgICA9PiAnY2hhbmdlX2J5JywKICAgICk7CgogICAgQVJSQVlQQVJBTToKICAgIGZvciBteSAkQXJyYXlQYXJhbSAoIGtleXMgJUFycmF5UGFyYW1zICkgewoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgISRQYXJhbXskQXJyYXlQYXJhbX07CgogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJyYXlQYXJhbX0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcnJheVBhcmFtIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfSApIHsKICAgICAgICAgICAgJE9uZVBhcmFtID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRPbmVQYXJhbSk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBzdHJpbmcKICAgICAgICBteSAkSW5TdHJpbmcgPSBqb2luIHF7LCB9LCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhJEluU3RyaW5nOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRBcnJheVBhcmFtc3sgJEFycmF5UGFyYW0gfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBzZXQgdGltZSBwYXJhbXMKICAgIG15ICVUaW1lUGFyYW1zID0gKAogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICdjcmVhdGVfdGltZSA+PScsCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJ2NyZWF0ZV90aW1lIDw9JywKICAgICAgICBDb25maWdJdGVtQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnY2hhbmdlX3RpbWUgPj0nLAogICAgICAgIENvbmZpZ0l0ZW1DaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICdjaGFuZ2VfdGltZSA8PScsCiAgICApOwoKICAgIFRJTUVQQVJBTToKICAgIGZvciBteSAkVGltZVBhcmFtICgga2V5cyAlVGltZVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBUSU1FUEFSQU0gaWYgISRQYXJhbXskVGltZVBhcmFtfTsKCiAgICAgICAgaWYgKCAkUGFyYW17JFRpbWVQYXJhbX0gIX4gbXsgXEEgXGRcZFxkXGQtXGRcZC1cZFxkIFxzIFxkXGQ6XGRcZDpcZFxkIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIGRhdGUgZm9ybWF0IGZvdW5kISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17JFRpbWVQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskVGltZVBhcmFtfSApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRUaW1lUGFyYW1zeyAkVGltZVBhcmFtIH0gJyRQYXJhbXsgJFRpbWVQYXJhbSB9JyI7CiAgICB9CgogICAgIyBjcmVhdGUgd2hlcmUgc3RyaW5nCiAgICBteSAkV2hlcmVTdHJpbmcgPSBAU1FMV2hlcmUgPyAnIFdIRVJFICcgLiBqb2luIHF7IEFORCB9LCBAU1FMV2hlcmUgOiAnJzsKCiAgICAjIGRlZmluZSBvcmRlciB0YWJsZQogICAgbXkgJU9yZGVyQnlUYWJsZSA9ICgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJ2lkJywKICAgICAgICBOdW1iZXIgICAgICAgPT4gJ2NvbmZpZ2l0ZW1fbnVtYmVyJywKICAgICAgICBDbGFzc0lEICAgICAgPT4gJ2NsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJ2N1cl9kZXBsX3N0YXRlX2lkJywKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJ2N1cl9pbmNpX3N0YXRlX2lkJywKICAgICAgICBDcmVhdGVUaW1lICAgPT4gJ2NyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVCeSAgICAgPT4gJ2NyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlVGltZSAgID0+ICdjaGFuZ2VfdGltZScsCiAgICAgICAgQ2hhbmdlQnkgICAgID0+ICdjaGFuZ2VfYnknLAogICAgKTsKCiAgICAjIHNldCBvcmRlciBieQogICAgbXkgJE9yZGVyQnkgPSAkT3JkZXJCeVRhYmxleyAkUGFyYW17T3JkZXJCeX0gfSB8fCAkT3JkZXJCeVRhYmxle0NvbmZpZ0l0ZW1JRH07CgogICAgIyBzZXQgbGltaXQKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gIlNFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gJFdoZXJlU3RyaW5nIE9SREVSIEJZICRPcmRlckJ5IEFTQyIsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1MaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQENvbmZpZ0l0ZW1MaXN0Owp9Cgo9aXRlbSBDdXJJbmNpU3RhdGVSZWNhbGMoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gbGlzdCBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRDb25maWdJdGVtTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VySW5jaVN0YXRlUmVjYWxjIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTGlua1R5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTTo6Q29yZTo6SW5jaWRlbnRMaW5rVHlwZScpOwogICAgbXkgJVNjYW5uZWRDb25maWdJdGVtSURzOwoKICAgICMgZmluZCBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYW4gaW5jaWRlbnQgc3RhdGUKICAgICRTZWxmLT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gXCVTY2FubmVkQ29uZmlnSXRlbUlEcywKICAgICk7CgogICAgIyBpbnZlc3RpZ2F0ZSBhbGwgY29uZmlnIGl0ZW1zIHdpdGggYW4gd2FybmluZyBzdGF0ZQogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVTY2FubmVkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9LT57VHlwZX0gbmUgJ2luY2lkZW50JzsKCiAgICAgICAgJFNlbGYtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBMaW5rVHlwZSAgICAgICAgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+IFwlU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgaW5jaWRlbnQgc3RhdGUgbGlzdCBvZiB3YXJuaW5ncwogICAgbXkgJFdhcm5TdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnd2FybmluZycsCiAgICApOwoKICAgIG15ICVSZXZlcnNlV2FyblN0YXRlTGlzdCA9IHJldmVyc2UgJXskV2FyblN0YXRlTGlzdH07CiAgICBteSBAU29ydGVkV2Fybkxpc3QgICAgICAgPSBzb3J0IGtleXMgJVJldmVyc2VXYXJuU3RhdGVMaXN0OwogICAgbXkgJFdhcm5pbmdTdGF0ZUlECiAgICAgICAgPSAkUmV2ZXJzZVdhcm5TdGF0ZUxpc3R7V2FybmluZ30gfHwgJFJldmVyc2VXYXJuU3RhdGVMaXN0eyAkU29ydGVkV2Fybkxpc3RbMF0gfTsKCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIGtleXMgJVNjYW5uZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIGV4dHJhY3QgaW5jaWRlbnQgc3RhdGUgdHlwZQogICAgICAgIG15ICRJbmNpU3RhdGVUeXBlID0gJFNjYW5uZWRDb25maWdJdGVtSURzeyRDb25maWdJdGVtSUR9e1R5cGV9OwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkSW5jaVN0YXRlVHlwZSBlcSAnaW5jaWRlbnQnOwoKICAgICAgICBteSAkQ3VySW5jaVN0YXRlSUQgPSAkV2FybmluZ1N0YXRlSUQ7CiAgICAgICAgaWYgKCAkSW5jaVN0YXRlVHlwZSBlcSAnb3BlcmF0aW9uYWwnICkgewoKICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRTZWxmLT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDdXJJbmNpU3RhdGVJRCA9ICRMYXN0VmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUIGN1cl9pbmNpX3N0YXRlX2lkID0gJEN1ckluY2lTdGF0ZUlEICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIGlkID0gJENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e1R5cGV9ID0gJ29wZXJhdGlvbmFsJzsKCiAgICAjIGZpbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMgKGNoaWxkcykKICAgIG15ICVMaW5rZWRDb25maWdJdGVtSURzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0tleUxpc3QoCiAgICAgICAgT2JqZWN0MSAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgS2V5MSAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIE9iamVjdDIgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFN0YXRlICAgICA9PiAnVmFsaWQnLAogICAgICAgIFR5cGUgICAgICA9PiAkUGFyYW17TGlua1R5cGV9LAogICAgICAgIERpcmVjdGlvbiA9PiAnQm90aCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICgga2V5cyAlTGlua2VkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gZGF0YQogICAgICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBDYWNoZSAgICAgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBpbmNpZGVudCBzdGF0ZQogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfSA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAkU2VsZi0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GaW5kV2FybkNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBpZ25vcmUgYWxyZWFkeSBzY2FubmVkIGlkcyAoaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uKQogICAgcmV0dXJuIGlmICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufTsKICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufSA9IDE7CgogICAgIyBmaW5kIGFsbCBsaW5rZWQgY29uZmlnIGl0ZW1zIChwYXJlbnRzKQogICAgbXkgJUxpbmtlZENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rS2V5TGlzdCgKICAgICAgICBPYmplY3QxICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkxICAgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgT2JqZWN0MiAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgRGlyZWN0aW9uID0+ICdCb3RoJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBrZXlzICVMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbgogICAgICAgICRTZWxmLT5fRmluZFdhcm5Db25maWdJdGVtcygKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSwKICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgPT4gJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENPTkZJR0lURU1JRAogICAgICAgICAgICBpZiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LT57JENvbmZpZ0l0ZW1JRH0tPntUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfS0+eyRDb25maWdJdGVtSUR9LT57VHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgIyBzZXQgd2FybmluZyBzdGF0ZQogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPnskQ29uZmlnSXRlbUlEfS0+e1R5cGV9ID0gJ3dhcm5pbmcnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfUHJlcGFyZUxpa2VTdHJpbmcoKQoKaW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJlcGFyZSBsaWtlIHN0cmluZ3MKCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+X1ByZXBhcmVMaWtlU3RyaW5nKCAkU3RyaW5nUmVmICk7Cgo9Y3V0CgpzdWIgX1ByZXBhcmVMaWtlU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICRWYWx1ZSApID0gQF87CgogICAgcmV0dXJuIGlmICEkVmFsdWU7CiAgICByZXR1cm4gaWYgcmVmICRWYWx1ZSBuZSAnU0NBTEFSJzsKCiAgICAjIFF1b3RlCiAgICAkeyRWYWx1ZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICR7JFZhbHVlfSwgJ0xpa2UnICk7CgogICAgIyByZXBsYWNlICogd2l0aCAlCiAgICAkeyRWYWx1ZX0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgIHJldHVybjsKfQoKPWl0ZW0gQ29uZmlnSXRlbUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNvbmZpZ2l0ZW0uIElmIGEgY29uZmlnaXRlbSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjb25maWdpdGVtLiBJZiBhIGNvbmZpZ2l0ZW0gbnVtYmVyIGlzIGdpdmVuLAp0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJE5hbWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJElkID0gJEhpc3RvcnlPYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAxMDAwMDAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCRLZXkpID0gZ3JlcCB7ICRQYXJhbXskX30gfSBxdyhDb25maWdJdGVtSUQgQ29uZmlnSXRlbU51bWJlcik7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkS2V5ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQgb3IgQ29uZmlnSXRlbU51bWJlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgcmVzdWx0IGlzIGNhY2hlZCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1Mb29rdXB9LT57JEtleX0tPnsgJFBhcmFteyRLZXl9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1Mb29rdXB9LT57JEtleX0tPnsgJFBhcmFteyRLZXl9IH07CgogICAgIyBzZXQgdGhlIGFwcHJvcHJpYXRlIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRTUUwgPSAnU0VMRUNUIGNvbmZpZ2l0ZW1fbnVtYmVyIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nOwoKICAgIGlmICggJEtleSBlcSAnQ29uZmlnSXRlbU51bWJlcicgKSB7CiAgICAgICAgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNvbmZpZ2l0ZW1fbnVtYmVyID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbUxvb2t1cH0tPnskS2V5fS0+eyAkUGFyYW17JEtleX0gfSA9ICRWYWx1ZTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBDb25maWdJdGVtRXZlbnRIYW5kbGVyUG9zdCgpCgpjYWxsIGNvbmZpZyBpdGVtIGV2ZW50IHBvc3QgaGFuZGxlciwgcmV0dXJucyB0cnVlIGlmIGl0J3MgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5CgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgRXZlbnQgICAgICAgID0+ICdOZXdDb25maWdJdGVtJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMTIzLAogICAgKTsKCmV2ZW50cyBhdmFpbGFibGU6CgpDb25maWdJdGVtQ3JlYXRlLCBWZXJzaW9uQ3JlYXRlLCBEZXBsb3ltZW50U3RhdGVVcGRhdGUsIEluY2lkZW50U3RhdGVVcGRhdGUsCkNvbmZpZ0l0ZW1EZWxldGUsIExpbmtBZGQsIExpbmtEZWxldGUsIERlZmluaXRpb25VcGRhdGUsIE5hbWVVcGRhdGUsIFZhbHVlVXBkYXRlCkRlZmluaXRpb25DcmVhdGUsIFZlcnNpb25EZWxldGUKCj1jdXQKCnN1YiBDb25maWdJdGVtRXZlbnRIYW5kbGVyUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRXZlbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgaXQgaXMgbm90IGEgRGVmaW5pdGlvbkNyZWF0ZSBldmVudCwgdGhlIGNvbmZpZyBpdGVtIGlkIGlzIG5lZWRlZAogICAgaWYgKCAkUGFyYW17RXZlbnR9IG5lICdEZWZpbml0aW9uQ3JlYXRlJyAmJiAhJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENvbmZpZ0l0ZW1JRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBjb25maWcgaXRlbSBldmVudCBtb2R1bGUKICAgIG15ICRNb2R1bGVzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Db25maWdJdGVtOjpFdmVudE1vZHVsZVBvc3QnKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVzOwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlcyBuZSAnSEFTSCc7CgogICAgIyB0cnkgdG8gbG9hZCB0aGUgZXZlbnQgbW9kdWxlcwogICAgTU9EVUxFOgogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlc30gKSB7CgogICAgICAgIG15ICRFdmVudCA9ICRNb2R1bGVzLT57JE1vZHVsZX0tPntFdmVudH07CgogICAgICAgIG5leHQgTU9EVUxFIGlmICRFdmVudCAmJiAkUGFyYW17RXZlbnR9ICF+IG17IFxRICRFdmVudCBcRSB9eG1zaTsKCiAgICAgICAgbXkgJE1vZHVsZU5hbWUgPSAkTW9kdWxlcy0+eyRNb2R1bGV9LT57TW9kdWxlfTsKCiAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZU5hbWUpOwoKICAgICAgICBteSAkR2VuZXJpYyA9ICRNb2R1bGVOYW1lLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBDb25maWdJdGVtT2JqZWN0ID0+ICRTZWxmLAogICAgICAgICk7CgogICAgICAgICMgcnVuIGV2ZW50IGhhbmRsZXIKICAgICAgICAkR2VuZXJpYy0+UnVuKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENvbmZpZyA9PiAkTW9kdWxlcy0+eyRNb2R1bGV9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE4ICQgJERhdGU6IDIwMDkvMDgvMjQgMTE6MDU6NTUgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRGVmaW5pdGlvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBkZWZpbml0aW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGVmaW5pdGlvbi5wbSx2IDEuNiAyMDA5LzA4LzE5IDIyOjQ4OjE0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpEZWZpbml0aW9uIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGRlZmluaXRpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIERlZmluaXRpb25MaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGRlZmluaXRpb24gbGlzdCBhcyBhcnJheWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJERlZmluaXRpb25MaXN0UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25MaXN0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiwgdmVyc2lvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uIFdIRVJFIGNsYXNzX2lkID0gPyBPUkRFUiBCWSB2ZXJzaW9uJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgKTsKCiAgICBteSBARGVmaW5pdGlvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVEZWZpbml0aW9uOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb259ICAgPSAkUm93WzFdOwogICAgICAgICREZWZpbml0aW9ue1ZlcnNpb259ICAgICAgPSAkUm93WzJdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZVRpbWV9ICAgPSAkUm93WzNdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZUJ5fSAgICAgPSAkUm93WzRdOwoKICAgICAgICBwdXNoIEBEZWZpbml0aW9uTGlzdCwgXCVEZWZpbml0aW9uOwogICAgfQoKICAgIHJldHVybiBcQERlZmluaXRpb25MaXN0Owp9Cgo9aXRlbSBEZWZpbml0aW9uR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGRlZmluaXRpb24gYXMgaGFzaCByZWZlcmVuY2UKClJldHVybgogICAgJERlZmluaXRpb257RGVmaW5pdGlvbklEfQogICAgJERlZmluaXRpb257Q2xhc3NJRH0KICAgICREZWZpbml0aW9ue0NsYXNzfQogICAgJERlZmluaXRpb257RGVmaW5pdGlvbn0KICAgICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9CiAgICAkRGVmaW5pdGlvbntWZXJzaW9ufQogICAgJERlZmluaXRpb257Q3JlYXRlVGltZX0KICAgICREZWZpbml0aW9ue0NyZWF0ZUJ5fQoKICAgIG15ICREZWZpbml0aW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPkRlZmluaXRpb25HZXQoCiAgICAgICAgRGVmaW5pdGlvbklEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkRGVmaW5pdGlvblJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtEZWZpbml0aW9uSUR9ICYmICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlZmluaXRpb25JRCBvciBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVmaW5pdGlvbklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntEZWZpbml0aW9uR2V0fS0+eyAkUGFyYW17RGVmaW5pdGlvbklEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57RGVmaW5pdGlvbkdldH0tPnsgJFBhcmFte0RlZmluaXRpb25JRH0gfTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNsYXNzX2lkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkgJwogICAgICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX2RlZmluaXRpb24gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0RlZmluaXRpb25JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYXNrIGRhdGFiYXNlCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjbGFzc19pZCwgY29uZmlnaXRlbV9kZWZpbml0aW9uLCB2ZXJzaW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5ICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9kZWZpbml0aW9uICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNsYXNzX2lkID0gPyBPUkRFUiBCWSB2ZXJzaW9uIERFU0MnLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURlZmluaXRpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREZWZpbml0aW9ue0NsYXNzSUR9ICAgICAgPSAkUm93WzFdOwogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb259ICAgPSAkUm93WzJdOwogICAgICAgICREZWZpbml0aW9ue1ZlcnNpb259ICAgICAgPSAkUm93WzNdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZVRpbWV9ICAgPSAkUm93WzRdOwogICAgICAgICREZWZpbml0aW9ue0NyZWF0ZUJ5fSAgICAgPSAkUm93WzVdOwoKICAgICAgICAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSA9IGV2YWwgJERlZmluaXRpb257RGVmaW5pdGlvbn07CiAgICB9CgogICAgcmV0dXJuIHt9IGlmICEkRGVmaW5pdGlvbntEZWZpbml0aW9uSUR9OwoKICAgICMgcHJlcGFyZSBkZWZpbml0aW9uCiAgICBpZiAoICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9ICYmIHJlZiAkRGVmaW5pdGlvbntEZWZpbml0aW9uUmVmfSBlcSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT5fRGVmaW5pdGlvblByZXBhcmUoCiAgICAgICAgICAgIERlZmluaXRpb25SZWYgPT4gJERlZmluaXRpb257RGVmaW5pdGlvblJlZn0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREZWZpbml0aW9ue0RlZmluaXRpb25SZWZ9ID0gJyc7CiAgICB9CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGFkZCBjbGFzcwogICAgJERlZmluaXRpb257Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkRGVmaW5pdGlvbntDbGFzc0lEfSB9OwoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntEZWZpbml0aW9uR2V0fS0+eyAkRGVmaW5pdGlvbntEZWZpbml0aW9uSUR9IH0gPSBcJURlZmluaXRpb247CgogICAgcmV0dXJuIFwlRGVmaW5pdGlvbjsKfQoKPWl0ZW0gRGVmaW5pdGlvbkFkZCgpCgphZGQgYSBuZXcgZGVmaW5pdGlvbgoKICAgIG15ICREZWZpbml0aW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkFkZCgKICAgICAgICBDbGFzc0lEICAgID0+IDEyMywKICAgICAgICBEZWZpbml0aW9uID0+ICd0aGUgZGVmaW5pdGlvbiBjb2RlJywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIERlZmluaXRpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBEZWZpbml0aW9uIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBkZWZpbml0aW9uCiAgICBteSAkQ2hlY2sgPSAkU2VsZi0+RGVmaW5pdGlvbkNoZWNrKAogICAgICAgIERlZmluaXRpb24gPT4gJFBhcmFte0RlZmluaXRpb259LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGVjazsKCiAgICAjIGdldCBsYXN0IGRlZmluaXRpb24KICAgIG15ICRMYXN0RGVmaW5pdGlvbiA9ICRTZWxmLT5EZWZpbml0aW9uR2V0KAogICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgKTsKCiAgICAjIHN0b3AgYWRkLCBpZiBkZWZpbml0aW9uIHdhcyBub3QgY2hhbmdlZAogICAgaWYgKCAkTGFzdERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICYmICRMYXN0RGVmaW5pdGlvbi0+e0RlZmluaXRpb259IGVxICRQYXJhbXtEZWZpbml0aW9ufSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGFkZCBuZXcgZGVmaW5pdGlvbiEgVGhlIGRlZmluaXRpb24gd2FzIG5vdCBjaGFuZ2VkLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgdmVyc2lvbgogICAgbXkgJFZlcnNpb24gPSAxOwogICAgaWYgKCAkTGFzdERlZmluaXRpb24tPntWZXJzaW9ufSApIHsKICAgICAgICAkVmVyc2lvbiA9ICRMYXN0RGVmaW5pdGlvbi0+e1ZlcnNpb259OwogICAgICAgICRWZXJzaW9uKys7CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IGRlZmluaXRpb24KICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbV9kZWZpbml0aW9uICcKICAgICAgICAgICAgLiAnKGNsYXNzX2lkLCBjb25maWdpdGVtX2RlZmluaXRpb24sIHZlcnNpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9LCBcJFBhcmFte0RlZmluaXRpb259LCBcJFZlcnNpb24sIFwkUGFyYW17VXNlcklEfSBdLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICMgZ2V0IGlkIG9mIG5ldyBkZWZpbml0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW1fZGVmaW5pdGlvbiBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2NsYXNzX2lkID0gPyBBTkQgdmVyc2lvbiA9ID8gJwogICAgICAgICAgICAuICdPUkRFUiBCWSB2ZXJzaW9uIERFU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9LCBcJFZlcnNpb24gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICREZWZpbml0aW9uSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREZWZpbml0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdHJpZ2dlciBEZWZpbml0aW9uQ3JlYXRlIGV2ZW50CiAgICAkU2VsZi0+Q29uZmlnSXRlbUV2ZW50SGFuZGxlclBvc3QoCiAgICAgICAgRXZlbnQgICA9PiAnRGVmaW5pdGlvbkNyZWF0ZScsCiAgICAgICAgQ29tbWVudCA9PiAkRGVmaW5pdGlvbklELAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkRGVmaW5pdGlvbklEOwp9Cgo9aXRlbSBEZWZpbml0aW9uQ2hlY2soKQoKY2hlY2sgdGhlIHN5bnRheCBvZiBhIG5ldyBkZWZpbml0aW9uCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkNoZWNrKAogICAgICAgIERlZmluaXRpb24gPT4gJ3RoZSBkZWZpbml0aW9uIGNvZGUnLAogICAgKTsKCj1jdXQKCnN1YiBEZWZpbml0aW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0RlZmluaXRpb259ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBEZWZpbml0aW9uIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERlZmluaXRpb24gPSBldmFsICRQYXJhbXtEZWZpbml0aW9ufTsKCiAgICBpZiAoICEkRGVmaW5pdGlvbiApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgWW91IGhhdmUgYW4gc3ludGF4IGVycm9yIGluIHRoZSBkZWZpbml0aW9uLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJERlZmluaXRpb24gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgRGVmaW5pdGlvbiEgRGVmaW5pdGlvbiBpcyBub3QgYW4gYXJyYXkgcmVmZXJlbmNlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZWN1c2lvbiBjaGVjawoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRGVmaW5pdGlvblByZXBhcmUoKQoKUHJlcGFyZSB0aGUgc3ludGF4IG9mIGEgbmV3IGRlZmluaXRpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5fRGVmaW5pdGlvblByZXBhcmUoCiAgICAgICAgRGVmaW5pdGlvblJlZiA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9EZWZpbml0aW9uUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZGVmaW5pdGlvbgogICAgaWYgKCAhJFBhcmFte0RlZmluaXRpb25SZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBEZWZpbml0aW9uUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte0RlZmluaXRpb25SZWZ9IH0gKSB7CgogICAgICAgICMgc2V0IENvdW50TWluCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgJEl0ZW0tPntDb3VudE1pbn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQ291bnRNYXgKICAgICAgICAkSXRlbS0+e0NvdW50TWF4fSB8fD0gMTsKCiAgICAgICAgIyBzZXQgQ291bnRNaW4KICAgICAgICBpZiAoICRJdGVtLT57Q291bnRNaW59ID4gJEl0ZW0tPntDb3VudE1heH0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnRNaW59ID0gJEl0ZW0tPntDb3VudE1heH07CiAgICAgICAgfQoKICAgICAgICAjIHNldCBDb3VudERlZmF1bHQKICAgICAgICBpZiAoICFkZWZpbmVkICRJdGVtLT57Q291bnREZWZhdWx0fSApIHsKICAgICAgICAgICAgJEl0ZW0tPntDb3VudERlZmF1bHR9ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkSXRlbS0+e0NvdW50RGVmYXVsdH0gPCAkSXRlbS0+e0NvdW50TWlufSApIHsKICAgICAgICAgICAgJEl0ZW0tPntDb3VudERlZmF1bHR9ID0gJEl0ZW0tPntDb3VudE1pbn07CiAgICAgICAgfQogICAgICAgIGlmICggJEl0ZW0tPntDb3VudERlZmF1bHR9ID4gJEl0ZW0tPntDb3VudE1heH0gKSB7CiAgICAgICAgICAgICRJdGVtLT57Q291bnREZWZhdWx0fSA9ICRJdGVtLT57Q291bnRNYXh9OwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24sIGlmICJTdWIiIGlzIGRlZmluZWQuCiAgICAgICAgaWYgKCAkSXRlbS0+e1N1Yn0gJiYgcmVmICRJdGVtLT57U3VifSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+X0RlZmluaXRpb25QcmVwYXJlKAogICAgICAgICAgICAgICAgRGVmaW5pdGlvblJlZiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntTdWJ9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA5LzA4LzE5IDIyOjQ4OjE0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vSGlzdG9yeS5wbSAtIG1vZHVsZSBmb3IgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBoaXN0b3J5IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSGlzdG9yeS5wbSx2IDEuOSAyMDA5LzA4LzI0IDA5OjE2OjQwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Okhpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6SGlzdG9yeSAtIG1vZHVsZSBmb3IgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCBoaXN0b3J5IGZ1bmN0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgaGlzdG9yeSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gSGlzdG9yeUdldCgpCgpSZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIGFsbCBoaXN0b3J5IGVudHJpZXMgZm9yIHRoZSBnaXZlbiBjb25maWcgaXRlbS4KRWFjaCBhcnJheSBlbGVtZW50IGlzIGEgaGFzaCByZWZlcmVuY2UgcmVwcmVzZW50aW5nIG9uZSBoaXN0b3J5IGVudHJ5LgoKVGhlc2UgaGFzaCByZWZlcmVuY2VzIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQ6CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDb25maWdJdGVtSUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tDb21tZW50fQogICAgJEluZm97Q3JlYXRlZEJ5fQogICAgJEluZm97Q3JlYXRlZFRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRJbmZvID0gJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGNhY2hlZCByZXN1bHQgZXhpc3RzLCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NJVmVyc2lvbnN9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CgogICAgIyBmZXRjaCBzb21lIGRhdGEgZnJvbSBoaXN0b3J5IGZvciBnaXZlbiBjb25maWcgaXRlbQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjaC5pZCwgY2guY29uZmlnaXRlbV9pZCwgY2guY29udGVudCwgY2gudHlwZV9pZCwgJwogICAgICAgICAgICAuICdjaC5jcmVhdGVfYnksIGNoLmNyZWF0ZV90aW1lLCBjaHQubmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV9oaXN0b3J5IGNoLCBjb25maWdpdGVtX2hpc3RvcnlfdHlwZSBjaHQgJwogICAgICAgICAgICAuICdXSEVSRSBjaC50eXBlX2lkID0gY2h0LmlkIEFORCBjaC5jb25maWdpdGVtX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNoLmlkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgc2F2ZSBkYXRhIGZyb20gaGlzdG9yeSBpbiBhcnJheQogICAgbXkgQEVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVUbXAgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgID0+ICRSb3dbM10sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRSb3dbNl0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBARW50cmllcywgXCVUbXA7CiAgICB9CgogICAgIyBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2VyIHdobyBjcmVhdGVkIGhpc3RvcnkgZW50cmllcwogICAgZm9yIG15ICRFbnRyeSAoQEVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBpbmZvcm1hdGlvbgogICAgICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJEVudHJ5LT57Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgaGlzdG9yeSBlbnRyeQogICAgICAgICRFbnRyeS0+e1VzZXJJRH0gICAgICAgID0gJFVzZXJJbmZve1VzZXJJRH07CiAgICAgICAgJEVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlckluZm97VXNlckxvZ2lufTsKICAgICAgICAkRW50cnktPntVc2VyRmlyc3RuYW1lfSA9ICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICAgICAkRW50cnktPntVc2VyTGFzdG5hbWV9ICA9ICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgfQoKICAgICMgc2F2ZSByZXN1bHQgaW4gY2FjaGUKICAgICRTZWxmLT57Q2FjaGV9LT57Q0lWZXJzaW9uc30tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfSA9IFxARW50cmllczsKCiAgICByZXR1cm4gXEBFbnRyaWVzOwp9Cgo9aXRlbSBIaXN0b3J5RW50cnlHZXQoKQoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeS4KVGhlIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQ6CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDb25maWdJdGVtSUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tDb21tZW50fQogICAgJEluZm97Q3JlYXRlQnl9CiAgICAkSW5mb3tDcmVhdGVUaW1lfQogICAgJEluZm97VXNlcklEfQogICAgJEluZm97VXNlckxvZ2lufQogICAgJEluZm97VXNlckxhc3RuYW1lfQogICAgJEluZm97VXNlckZpcnN0bmFtZX0KCiAgICBteSAkSW5mbyA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5RW50cnlHZXQoCiAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeUVudHJ5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhIaXN0b3J5RW50cnlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIGNhY2hlZCByZXN1bHQgZXhpc3RzLCByZXR1cm4gdGhhdCByZXN1bHQKICAgIGlmICggJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9ICkgewogICAgICAgIG15ICgkQ29uZmlnSXRlbUlEKSA9IGtleXMgJXsgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnsgJFBhcmFte0hpc3RvcnlFbnRyeUlEfSB9IH07CiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbnN9LT57ICRQYXJhbXtIaXN0b3J5RW50cnlJRH0gfS0+eyRDb25maWdJdGVtSUR9OwogICAgfQoKICAgICMgZmV0Y2ggYSBzaW5nbGUgZW50cnkgZnJvbSBoaXN0b3J5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoLmlkLCBjaC5jb25maWdpdGVtX2lkLCBjaC5jb250ZW50LCBjaC50eXBlX2lkLCAnCiAgICAgICAgICAgIC4gJ2NoLmNyZWF0ZV9ieSwgY2guY3JlYXRlX3RpbWUsIGNodC5uYW1lICcKICAgICAgICAgICAgLiAnRlJPTSBjb25maWdpdGVtX2hpc3RvcnkgY2gsIGNvbmZpZ2l0ZW1faGlzdG9yeV90eXBlIGNodCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoLnR5cGVfaWQgPSBjaHQuaWQgQU5EIGNoLmlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0hpc3RvcnlFbnRyeUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVFbnRyeTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICVFbnRyeSA9ICgKICAgICAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCAgPT4gJFJvd1szXSwKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFJvd1s0XSwKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJFJvd1s2XSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZGF0YSBmb3IgdGhpcyBlbnRyeQogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRFbnRyeXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICRFbnRyeXtVc2VySUR9ICAgICAgICA9ICRVc2VySW5mb3tVc2VySUR9OwogICAgJEVudHJ5e1VzZXJMb2dpbn0gICAgID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAkRW50cnl7VXNlckZpcnN0bmFtZX0gPSAkVXNlckluZm97VXNlckZpcnN0bmFtZX07CiAgICAkRW50cnl7VXNlckxhc3RuYW1lfSAgPSAkVXNlckluZm97VXNlckxhc3RuYW1lfTsKCiAgICAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25zfS0+eyAkUGFyYW17SGlzdG9yeUVudHJ5SUR9IH0tPnsgJEVudHJ5e0NvbmZpZ0l0ZW1JRH0gfSA9IFwlRW50cnk7CgogICAgcmV0dXJuIFwlRW50cnk7Cn0KCj1pdGVtIEhpc3RvcnlBZGQoKQoKQWRkcyBhIHNpbmdsZSBoaXN0b3J5IGVudHJ5IHRvIHRoZSBoaXN0b3J5LgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gMTIzNCwKICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdOZXdDb25maWdJdGVtJywgIyBlaXRoZXIgSGlzdG9yeVR5cGUgb3IgSGlzdG9yeVR5cGVJRCBpcyBuZWVkZWQKICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0FueSB1c2VmdWwgaW5mb3JtYXRpb24nLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgVXNlcklEIENvbW1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhKCAkUGFyYW17SGlzdG9yeVR5cGV9IHx8ICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBIaXN0b3J5VHlwZSBvciBIaXN0b3J5VHlwZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSB0eXBlIGlkIGZyb20gaGlzdG9yeSB0eXBlIGlmIGhpc3RvcnkgdHlwZSBpcyBnaXZlbi4KICAgIGlmICggJFBhcmFte0hpc3RvcnlUeXBlfSApIHsKICAgICAgICBteSAkSWQgPSAkU2VsZi0+SGlzdG9yeVR5cGVMb29rdXAoIEhpc3RvcnlUeXBlID0+ICRQYXJhbXtIaXN0b3J5VHlwZX0gKTsKCiAgICAgICAgaWYgKCAhJElkICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBoaXN0b3J5IHR5cGUgZ2l2ZW4hJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0hpc3RvcnlUeXBlSUR9ID0gJElkOwogICAgfQoKICAgICMgaWYgaGlzdG9yeSB0eXBlIGlzIGdpdmVuCiAgICBlbHNpZiAoICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT5IaXN0b3J5VHlwZUxvb2t1cCggSGlzdG9yeVR5cGVJRCA9PiAkUGFyYW17SGlzdG9yeVR5cGVJRH0gKTsKCiAgICAgICAgaWYgKCAhJE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIGhpc3RvcnkgdHlwZSBpZCBnaXZlbiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZ2l2ZW4gY29uZmlnIGl0ZW0gaWQgcG9pbnRzIHRvIGFuIGV4aXN0aW5nIGNvbmZpZyBpdGVtIGlkCiAgICBpZiAoICRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgIG15ICRJZCA9ICRTZWxmLT5Db25maWdJdGVtTG9va3VwKCBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKTsKCiAgICAgICAgaWYgKCAhJElkICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBjb25maWcgaXRlbSBpZCBnaXZlbiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlZCByZXN1bHRzCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb25zfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9OwoKICAgICMgaW5zZXJ0IGhpc3RvcnkgZW50cnkKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtX2hpc3RvcnkgKCBjb25maWdpdGVtX2lkLCBjb250ZW50LCBjcmVhdGVfYnksICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIHR5cGVfaWQgKSBWQUxVRVMgKCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyApJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SGlzdG9yeVR5cGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEhpc3RvcnlEZWxldGUoKQoKRGVsZXRlcyBjb21wbGV0ZSBoaXN0b3J5IGZvciBhIGdpdmVuIGNvbmZpZyBpdGVtCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkhpc3RvcnlEZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlZCByZXN1bHRzCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntDSVZlcnNpb259LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH07CiAgICBmb3IgbXkgJFZlcnNpb25OciAoIGtleXMgJXsgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30gfSApIHsKICAgICAgICBteSAoJENhY2hlQ29uZmlnSXRlbSkgPSBrZXlzICV7ICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbnN9LT57JFZlcnNpb25Ocn0gfTsKICAgICAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uc30tPnskVmVyc2lvbk5yfSBpZiAkQ2FjaGVDb25maWdJdGVtIGVxICRQYXJhbXtDb25maWdJdGVtSUR9OwogICAgfQoKICAgICMgZGVsZXRlIGhpc3RvcnkgZm9yIGdpdmVuIGNvbmZpZyBpdGVtCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeSBXSEVSRSBjb25maWdpdGVtX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgKTsKfQoKPWl0ZW0gSGlzdG9yeUVudHJ5RGVsZXRlKCkKCkRlbGV0ZXMgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeS4KCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+SGlzdG9yeUVudHJ5RGVsZXRlKAogICAgICAgIEhpc3RvcnlFbnRyeUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSGlzdG9yeUVudHJ5RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhIaXN0b3J5RW50cnlJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBzaW5nbGUgZW50cnkKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9oaXN0b3J5IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SGlzdG9yeUVudHJ5SUR9IF0sCiAgICApOwp9Cgo9aXRlbSBIaXN0b3J5VHlwZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGhpc3RvcnkgdHlwZS4gSWYgYSBoaXN0b3J5IHR5cGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGhpc3RvcnkgdHlwZS4gSWYgYSBoaXN0b3J5IHR5cGUgaXMgZ2l2ZW4sIHRoZSBhcHByb3ByaWF0ZQppZCBpcyByZXR1cm5lZC4KCiAgICBteSAkTmFtZSA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDEyMzQsCiAgICApOwoKICAgIG15ICRJZCA9ICRDb25maWdJdGVtT2JqZWN0LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZSA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlUeXBlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgKCRLZXkpID0gZ3JlcCB7ICRQYXJhbXskX30gfSBxdyhIaXN0b3J5VHlwZUlEIEhpc3RvcnlUeXBlKTsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRLZXkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEhpc3RvcnlUeXBlSUQgb3IgSGlzdG9yeVR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHJlc3VsdCBpcyBjYWNoZWQgcmV0dXJuIHRoYXQgcmVzdWx0CiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntIaXN0b3J5VHlwZUxvb2t1cH0tPnsgJFBhcmFteyRLZXl9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0hpc3RvcnlUeXBlTG9va3VwfS0+eyAkUGFyYW17JEtleX0gfTsKCiAgICAjIHNldCB0aGUgYXBwcm9wcmlhdGUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgbmFtZSBGUk9NIGNvbmZpZ2l0ZW1faGlzdG9yeV90eXBlIFdIRVJFIGlkID0gPyc7CgogICAgaWYgKCAkS2V5IGVxICdIaXN0b3J5VHlwZScgKSB7CiAgICAgICAgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtX2hpc3RvcnlfdHlwZSBXSEVSRSBuYW1lID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZSBpbiBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPntIaXN0b3J5VHlwZUxvb2t1cH0tPnsgJFBhcmFteyRLZXl9IH0gPSAkVmFsdWU7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzA4LzI0IDA5OjE2OjQwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIG51bWJlciBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE51bWJlci5wbSx2IDEuNCAyMDA5LzA4LzE5IDIyOjQ4OjE0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckxvb2t1cCgpCgpyZXR1cm4gY29uZmlnIGl0ZW0gaWQgb3IgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJENvbmZpZ0l0ZW1OdW1iZXIgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICcxMjM0NTQzMjEnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbmZpZ0l0ZW1JRCBvciBDb25maWdJdGVtTnVtYmVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e0lEfS0+eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57Q29uZmlnSXRlbU51bWJlckxvb2t1cH0tPntJRH0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfTsKCiAgICAgICAgIyBhc2sgZGF0YWJhc2UKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBjb25maWdpdGVtX251bWJlciBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlcjsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlciA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57SUR9LT57ICRQYXJhbXtDb25maWdJdGVtSUR9IH0KICAgICAgICAgICAgPSAkQ29uZmlnSXRlbU51bWJlcjsKCiAgICAgICAgcmV0dXJuICRDb25maWdJdGVtTnVtYmVyOwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntDb25maWdJdGVtTnVtYmVyTG9va3VwfS0+e051bWJlcn0tPnsgJFBhcmFte0NvbmZpZ0l0ZW1OdW1iZXJ9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfTsKCiAgICAjIHF1b3RlCiAgICAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSApOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSBjb25maWdpdGVtX251bWJlciA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtTnVtYmVyfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvbmZpZ0l0ZW1JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0NvbmZpZ0l0ZW1OdW1iZXJMb29rdXB9LT57TnVtYmVyfS0+eyAkUGFyYW17Q29uZmlnSXRlbU51bWJlcn0gfQogICAgICAgID0gJENvbmZpZ0l0ZW1JRDsKCiAgICByZXR1cm4gJENvbmZpZ0l0ZW1JRDsKfQoKPWl0ZW0gQ29uZmlnSXRlbU51bWJlckNyZWF0ZSgpCgpjcmVhdGUgYSBuZXcgY29uZmlnIGl0ZW0gbnVtYmVyCgogICAgbXkgJE51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtTnVtYmVyQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFR5cGUgQ2xhc3NJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRQYXJhbXtUeXBlfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBjb25maWcgaXRlbSBudW1iZXIgZ2VuZXJhdG9yIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEgJEAiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBwdXNoIEBJU0EsICRQYXJhbXtUeXBlfTsKCiAgICAjIGNyZWF0ZSBudW1iZXIKICAgIG15ICROdW1iZXIgPSAkU2VsZi0+X0NvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoJVBhcmFtKTsKCiAgICByZXR1cm4gJE51bWJlcjsKfQoKPWl0ZW0gQ3VycmVudENvdW50ZXJHZXQoKQoKcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50ZXIgb2YgYSBjbGFzcwoKICAgIG15ICRDb3VudGVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1cnJlbnRDb3VudGVyR2V0KAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBDdXJyZW50Q291bnRlckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY291bnRlciBGUk9NIGNvbmZpZ2l0ZW1fY291bnRlciBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2NsYXNzX2lkID0gPyBBTkQgY291bnRlcl90eXBlID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3NJRH0sIFwkUGFyYW17VHlwZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROdW1iZXI7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROdW1iZXIgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkTnVtYmVyOwp9Cgo9aXRlbSBDdXJyZW50Q291bnRlclNldCgpCgpzZXQgdGhlIGN1cnJlbnQgY291bnRlciBvZiBhIGNsYXNzCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VycmVudENvdW50ZXJTZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgVHlwZSAgICA9PiAnQXV0b0luY3JlbWVudCcsCiAgICAgICAgQ291bnRlciA9PiAnMTInLAogICAgKTsKCj1jdXQKCnN1YiBDdXJyZW50Q291bnRlclNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFR5cGUgQ291bnRlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGNvdW50ZXIKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2NvdW50ZXIgV0hFUkUgY2xhc3NfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgKTsKCiAgICAjIHNldCBuZXcgY291bnRlcgogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbV9jb3VudGVyICcKICAgICAgICAgICAgLiAnKGNsYXNzX2lkLCBjb3VudGVyX3R5cGUsIGNvdW50ZXIpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzSUR9LCBcJFBhcmFte1R5cGV9LCBcJFBhcmFte0NvdW50ZXJ9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDgvMTkgMjI6NDg6MTQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vVmVyc2lvbi5wbSAtIHN1YiBtb2R1bGUgb2YgSVRTTUNvbmZpZ0l0ZW0ucG0gd2l0aCB2ZXJzaW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVmVyc2lvbi5wbSx2IDEuMTUgMjAwOS8wOS8wMiAxMTowNDoyNSByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uIC0gc3ViIG1vZHVsZSBvZiBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHZlcnNpb24gZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFZlcnNpb25ab29tTGlzdCgpCgpyZXR1cm4gYSBjb25maWcgaXRlbSB2ZXJzaW9uIGxpc3QgYXMgYXJyYXloYXNoIHJlZmVyZW5jZQoKICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uWm9vbUxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvblpvb21MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgICMgZ2V0IHZlcnNpb24gem9vbSBsaXN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSwgZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGNvbmZpZ2l0ZW1faWQgPSA/IE9SREVSIEJZIGlkJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFZlcnNpb25MaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlVmVyc2lvbjsKICAgICAgICAkVmVyc2lvbntWZXJzaW9uSUR9ICAgPSAkUm93WzBdOwogICAgICAgICRWZXJzaW9ue05hbWV9ICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFZlcnNpb257RGVwbFN0YXRlSUR9ID0gJFJvd1syXTsKICAgICAgICAkVmVyc2lvbntJbmNpU3RhdGVJRH0gPSAkUm93WzNdOwogICAgICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9ICA9ICRSb3dbNF07CiAgICAgICAgJFZlcnNpb257Q3JlYXRlQnl9ICAgID0gJFJvd1s1XTsKCiAgICAgICAgcHVzaCBAVmVyc2lvbkxpc3QsIFwlVmVyc2lvbjsKICAgIH0KCiAgICBmb3IgbXkgJFZlcnNpb24gKEBWZXJzaW9uTGlzdCkgewoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGZ1bmN0aW9uYWxpdHkKICAgICAgICBteSAkRGVwbFN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAkVmVyc2lvbi0+e0RlcGxTdGF0ZX0gICAgID0gJERlcGxTdGF0ZS0+e05hbWV9OwogICAgICAgICRWZXJzaW9uLT57RGVwbFN0YXRlVHlwZX0gPSAkRGVwbFN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGZ1bmN0aW9uYWxpdHkKICAgICAgICBteSAkSW5jaVN0YXRlID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAkVmVyc2lvbi0+e0luY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgICAgICRWZXJzaW9uLT57SW5jaVN0YXRlVHlwZX0gPSAkSW5jaVN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgICAgICMgYWRkIGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICAkVmVyc2lvbi0+e0NsYXNzSUR9ICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfTsKICAgICAgICAkVmVyc2lvbi0+e0NsYXNzfSAgICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntDbGFzc307CiAgICAgICAgJFZlcnNpb24tPntOdW1iZXJ9ICAgICAgICAgICA9ICRDb25maWdJdGVtLT57TnVtYmVyfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZUlEfSAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGVJRH07CiAgICAgICAgJFZlcnNpb24tPntDdXJEZXBsU3RhdGV9ICAgICA9ICRDb25maWdJdGVtLT57Q3VyRGVwbFN0YXRlfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckRlcGxTdGF0ZVR5cGV9ID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGVUeXBlfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckluY2lTdGF0ZUlEfSAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVJRH07CiAgICAgICAgJFZlcnNpb24tPntDdXJJbmNpU3RhdGV9ICAgICA9ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlfTsKICAgICAgICAkVmVyc2lvbi0+e0N1ckluY2lTdGF0ZVR5cGV9ID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGVUeXBlfTsKICAgIH0KCiAgICByZXR1cm4gXEBWZXJzaW9uTGlzdDsKfQoKPWl0ZW0gVmVyc2lvbkxpc3QoKQoKcmV0dXJuIGEgY29uZmlnIGl0ZW0gdmVyc2lvbiBsaXN0IGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdmVyc2lvbiBsaXN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gT1JERVIgQlkgaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVmVyc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFZlcnNpb25MaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQFZlcnNpb25MaXN0Owp9Cgo9aXRlbSBWZXJzaW9uR2V0KCkKCnJldHVybiBhIHZlcnNpb24gb2YgYSBjb25maWcgaXRlbSBhcyBoYXNoIHJlZmVyZW5jZQoKUmV0dXJuCiAgICAkVmVyc2lvbntWZXJzaW9uSUR9CiAgICAkVmVyc2lvbntDb25maWdJdGVtSUR9CiAgICAkVmVyc2lvbntOdW1iZXJ9CiAgICAkVmVyc2lvbntDbGFzc0lEfQogICAgJFZlcnNpb257Q2xhc3N9CiAgICAkVmVyc2lvbntMYXN0VmVyc2lvbklEfQogICAgJFZlcnNpb257TmFtZX0KICAgICRWZXJzaW9ue0RlZmluaXRpb25JRH0KICAgICRWZXJzaW9ue0RlcGxTdGF0ZUlEfQogICAgJFZlcnNpb257RGVwbFN0YXRlfQogICAgJFZlcnNpb257RGVwbFN0YXRlVHlwZX0KICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZUlEfQogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlfQogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlVHlwZX0KICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfQogICAgJFZlcnNpb257SW5jaVN0YXRlfQogICAgJFZlcnNpb257SW5jaVN0YXRlVHlwZX0KICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZUlEfQogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlfQogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlVHlwZX0KICAgICRWZXJzaW9ue1hNTERlZmluaXRpb259CiAgICAkVmVyc2lvbntYTUxEYXRhfQogICAgJFZlcnNpb257Q3JlYXRlVGltZX0KICAgICRWZXJzaW9ue0NyZWF0ZUJ5fQoKICAgIG15ICRWZXJzaW9uUmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25HZXQoCiAgICAgICAgVmVyc2lvbklEICA9PiAxMjMsCiAgICAgICAgWE1MRGF0YUdldCA9PiAxLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICApOwoKICAgIG9yCgogICAgbXkgJFZlcnNpb25SZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtWZXJzaW9uSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVmVyc2lvbklEIG9yIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1hNTERhdGFHZXR9ICkgewogICAgICAgICRQYXJhbXtYTUxEYXRhR2V0fSA9IDE7CiAgICB9CgogICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uR2V0fS0+eyAkUGFyYW17VmVyc2lvbklEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfTsKCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwgJwogICAgICAgICAgICAgICAgLiAnZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VmVyc2lvbklEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgdmVyc2lvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZmlnaXRlbV9pZCwgbmFtZSwgZGVmaW5pdGlvbl9pZCwgJwogICAgICAgICAgICAgICAgLiAnZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVZlcnNpb247CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWZXJzaW9ue1ZlcnNpb25JRH0gICAgPSAkUm93WzBdOwogICAgICAgICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0gPSAkUm93WzFdOwogICAgICAgICRWZXJzaW9ue05hbWV9ICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRWZXJzaW9ue0RlZmluaXRpb25JRH0gPSAkUm93WzNdOwogICAgICAgICRWZXJzaW9ue0RlcGxTdGF0ZUlEfSAgPSAkUm93WzRdOwogICAgICAgICRWZXJzaW9ue0luY2lTdGF0ZUlEfSAgPSAkUm93WzVdOwogICAgICAgICRWZXJzaW9ue0NyZWF0ZVRpbWV9ICAgPSAkUm93WzZdOwogICAgICAgICRWZXJzaW9ue0NyZWF0ZUJ5fSAgICAgPSAkUm93WzddOwogICAgfQoKICAgICMgY2hlY2sgdmVyc2lvbgogICAgaWYgKCAhJFZlcnNpb257VmVyc2lvbklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHN1Y2ggY29uZmlnIGl0ZW0gdmVyc2lvbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJERlcGxTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbntEZXBsU3RhdGVJRH0sCiAgICApOwoKICAgICRWZXJzaW9ue0RlcGxTdGF0ZX0gICAgID0gJERlcGxTdGF0ZS0+e05hbWV9OwogICAgJFZlcnNpb257RGVwbFN0YXRlVHlwZX0gPSAkRGVwbFN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgZnVuY3Rpb25hbGl0eQogICAgbXkgJEluY2lTdGF0ZSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkVmVyc2lvbntJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRWZXJzaW9ue0luY2lTdGF0ZX0gICAgID0gJEluY2lTdGF0ZS0+e05hbWV9OwogICAgJFZlcnNpb257SW5jaVN0YXRlVHlwZX0gPSAkSW5jaVN0YXRlLT57RnVuY3Rpb25hbGl0eX07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRWZXJzaW9ue0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0gZGF0YQogICAgaWYgKCAhJENvbmZpZ0l0ZW0gfHwgcmVmICRDb25maWdJdGVtIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCBjb25maWcgaXRlbSAkVmVyc2lvbntDb25maWdJdGVtSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFZlcnNpb257Q2xhc3NJRH0gICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9OwogICAgJFZlcnNpb257Q2xhc3N9ICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e0NsYXNzfTsKICAgICRWZXJzaW9ue0xhc3RWZXJzaW9uSUR9ICAgID0gJENvbmZpZ0l0ZW0tPntMYXN0VmVyc2lvbklEfTsKICAgICRWZXJzaW9ue051bWJlcn0gICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZUlEfTsKICAgICRWZXJzaW9ue0N1ckRlcGxTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJEZXBsU3RhdGV9OwogICAgJFZlcnNpb257Q3VyRGVwbFN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZVR5cGV9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlSUR9ICAgPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZUlEfTsKICAgICRWZXJzaW9ue0N1ckluY2lTdGF0ZX0gICAgID0gJENvbmZpZ0l0ZW0tPntDdXJJbmNpU3RhdGV9OwogICAgJFZlcnNpb257Q3VySW5jaVN0YXRlVHlwZX0gPSAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9OwoKICAgIHJldHVybiBcJVZlcnNpb24gaWYgISRQYXJhbXtYTUxEYXRhR2V0fTsKCiAgICAjIGdldCB4bWwgZGVmaW5pdGlvbgogICAgbXkgJERlZmluaXRpb24gPSAkU2VsZi0+RGVmaW5pdGlvbkdldCgKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJFZlcnNpb257RGVmaW5pdGlvbklEfSwKICAgICk7CiAgICAkVmVyc2lvbntYTUxEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn07CgogICAgIyBnZXQgeG1sIGRhdGEKICAgICRWZXJzaW9ue1hNTERhdGF9ID0gJFNlbGYtPl9YTUxWZXJzaW9uR2V0KAogICAgICAgIENsYXNzSUQgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgIFZlcnNpb25JRCA9PiAkVmVyc2lvbntWZXJzaW9uSUR9LAogICAgKTsKCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnsgJFZlcnNpb257VmVyc2lvbklEfSB9ID0gXCVWZXJzaW9uOwoKICAgIHJldHVybiBcJVZlcnNpb247Cn0KCj1pdGVtIFZlcnNpb25Db25maWdJdGVtSURHZXQoKQoKcmV0dXJuIHRoZSBjb25maWcgaXRlbSBpZCBvZiBhIHZlcnNpb24KCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25Db25maWdJdGVtSURHZXQoCiAgICAgICAgVmVyc2lvbklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbkNvbmZpZ0l0ZW1JREdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VmVyc2lvbklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVmVyc2lvbklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25Db25maWdJdGVtSURHZXR9LT57ICRQYXJhbXtWZXJzaW9uSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1ZlcnNpb25Db25maWdJdGVtSURHZXR9LT57ICRQYXJhbXtWZXJzaW9uSUR9IH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgY29uZmlnaXRlbV9pZCBGUk9NIGNvbmZpZ2l0ZW1fdmVyc2lvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtWZXJzaW9uSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnsgJFBhcmFte1ZlcnNpb25JRH0gfSA9ICRDb25maWdJdGVtSUQ7CgogICAgcmV0dXJuICRDb25maWdJdGVtSUQ7Cn0KCj1pdGVtIFZlcnNpb25BZGQoKQoKYWRkIGEgbmV3IHZlcnNpb24KCiAgICBteSAkVmVyc2lvbklEID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywKICAgICAgICBEZWZpbml0aW9uSUQgPT4gMTIxMiwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gOCwKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gNCwKICAgICAgICBYTUxEYXRhICAgICAgPT4gJEFycmF5SGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDb25maWdJdGVtSUQgTmFtZSBEZWZpbml0aW9uSUQgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgIHJldHVybiBpZiAhJERlcGxTdGF0ZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICREZXBsU3RhdGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBkZXBsb3ltZW50IHN0YXRlIGlkCiAgICBpZiAoICEkRGVwbFN0YXRlTGlzdC0+eyAkUGFyYW17RGVwbFN0YXRlSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gdmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpZCBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW5jaVN0YXRlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGluY2lkZW50IHN0YXRlIGlkCiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdC0+eyAkUGFyYW17SW5jaVN0YXRlSUR9IH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gdmFsaWQgaW5jaWRlbnQgc3RhdGUgaWQgZ2l2ZW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBWZXJzaW9uTGlzdAogICAgbXkgJFZlcnNpb25MaXN0ID0gJFNlbGYtPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CgogICAgbXkgJENvbmZpZ0l0ZW1JbmZvID0ge307CgogICAgaWYgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG9sZCB2ZXJzaW9uIGluZm8gZm9yIGNvbXBhcmlzb25zIHdpdGggY3VycmVudCB2ZXJzaW9uCiAgICAgICAgIyB0aGlzIGlzIG5lZWRlZCB0byB0cmlnZ2VyIHNvbWUgZXZlbnRzCiAgICAgICAgJENvbmZpZ0l0ZW1JbmZvID0gJFNlbGYtPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbQogICAgICAgICRDb25maWdJdGVtSW5mbyA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRDb25maWdJdGVtSW5mbzsKICAgIHJldHVybiBpZiByZWYgJENvbmZpZ0l0ZW1JbmZvIG5lICdIQVNIJzsKCiAgICBteSAkRXZlbnRzID0gJFNlbGYtPl9HZXRFdmVudHMoCiAgICAgICAgUGFyYW0gICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICBDb25maWdJdGVtSW5mbyA9PiAkQ29uZmlnSXRlbUluZm8sCiAgICApOwoKICAgIG15ICRSZXR1cm5WZXJzaW9uSUQgPSBzY2FsYXIgQHskVmVyc2lvbkxpc3R9ID8gJFZlcnNpb25MaXN0LT5bLTFdIDogMDsKICAgIHJldHVybiAkUmV0dXJuVmVyc2lvbklEIGlmICEoICRFdmVudHMgJiYga2V5cyAleyRFdmVudHN9ICk7CgogICAgIyBpbnNlcnQgbmV3IHZlcnNpb24KICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbV92ZXJzaW9uICcKICAgICAgICAgICAgLiAnKGNvbmZpZ2l0ZW1faWQsIG5hbWUsIGRlZmluaXRpb25faWQsICcKICAgICAgICAgICAgLiAnZGVwbF9zdGF0ZV9pZCwgaW5jaV9zdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtEZWZpbml0aW9uSUR9LAogICAgICAgICAgICBcJFBhcmFte0RlcGxTdGF0ZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtJbmNpU3RhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJFZlcnNpb25JRCAoIEB7JFZlcnNpb25MaXN0fSApIHsKICAgICAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntWZXJzaW9uR2V0fS0+eyRWZXJzaW9uSUR9OwogICAgfQoKICAgICMgZ2V0IGlkIG9mIG5ldyB2ZXJzaW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY3JlYXRlX3RpbWUgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gV0hFUkUgJwogICAgICAgICAgICAuICdjb25maWdpdGVtX2lkID0gPyBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFZlcnNpb25JRDsKICAgIG15ICRDcmVhdGVUaW1lOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmVyc2lvbklEICA9ICRSb3dbMF07CiAgICAgICAgJENyZWF0ZVRpbWUgPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgdmVyc2lvbiBpZAogICAgaWYgKCAhJFZlcnNpb25JRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGdldCB0aGUgbmV3IHZlcnNpb24gaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCB4bWwgZGF0YQogICAgaWYgKCAkUGFyYW17WE1MRGF0YX0gJiYgcmVmICRQYXJhbXtYTUxEYXRhfSBlcSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT5fWE1MVmVyc2lvbkFkZCgKICAgICAgICAgICAgQ2xhc3NJRCAgICAgID0+ICRDb25maWdJdGVtSW5mby0+e0NsYXNzSUR9LAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFZlcnNpb25JRCAgICA9PiAkVmVyc2lvbklELAogICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgICk7CiAgICB9CgogICAgIyB1cGRhdGUgbGFzdF92ZXJzaW9uX2lkLCBjdXJfZGVwbF9zdGF0ZV9pZCwgY3VyX2luY2lfc3RhdGVfaWQsIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkKICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25maWdpdGVtIFNFVCBsYXN0X3ZlcnNpb25faWQgPSA/LCAnCiAgICAgICAgICAgIC4gJ2N1cl9kZXBsX3N0YXRlX2lkID0gPywgY3VyX2luY2lfc3RhdGVfaWQgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gPywgY2hhbmdlX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkVmVyc2lvbklELAogICAgICAgICAgICBcJFBhcmFte0RlcGxTdGF0ZUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtJbmNpU3RhdGVJRH0sCiAgICAgICAgICAgIFwkQ3JlYXRlVGltZSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyB0cmlnZ2VyIFZlcnNpb25DcmVhdGUgZXZlbnQKICAgICRTZWxmLT5Db25maWdJdGVtRXZlbnRIYW5kbGVyUG9zdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgRXZlbnQgICAgICAgID0+ICdWZXJzaW9uQ3JlYXRlJywKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgQ29tbWVudCAgICAgID0+ICRWZXJzaW9uSUQsCiAgICApOwoKICAgICMgY29tcGFyZSBjdXJyZW50IGFuZCBvbGQgdmFsdWVzCiAgICBpZiAoICRFdmVudHMtPntWYWx1ZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPl9DaGVja1ZhbHVlcygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBVcGRhdGVWYWx1ZXMgPT4gJEV2ZW50cy0+e1ZhbHVlVXBkYXRlfSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBkZWZpbml0aW9uIHVwZGF0ZSBldmVudAogICAgaWYgKCAkRXZlbnRzLT57RGVmaW5pdGlvblVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnRGVmaW5pdGlvblVwZGF0ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRFdmVudHMtPntEZWZpbml0aW9uVXBkYXRlfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgb2xkIGFuZCBuZXcgbmFtZQogICAgaWYgKCAkRXZlbnRzLT57TmFtZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnTmFtZVVwZGF0ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRFdmVudHMtPntOYW1lVXBkYXRlfSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBpbmNpZGVudCBzdGF0ZSB1cGRhdGUgZXZlbnQKICAgIGlmICggJEV2ZW50cy0+e0luY2lkZW50U3RhdGVVcGRhdGV9ICkgewogICAgICAgICRTZWxmLT5Db25maWdJdGVtRXZlbnRIYW5kbGVyUG9zdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICBFdmVudCAgICAgICAgPT4gJ0luY2lkZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkRXZlbnRzLT57SW5jaWRlbnRTdGF0ZVVwZGF0ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRyaWdnZXIgZGVwbG95bWVudCBzdGF0ZSB1cGRhdGUgZXZlbnQKICAgIGlmICggJEV2ZW50cy0+e0RlcGxveW1lbnRTdGF0ZVVwZGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEV2ZW50ICAgICAgICA9PiAnRGVwbG95bWVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEV2ZW50cy0+e0RlcGxveW1lbnRTdGF0ZVVwZGF0ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIG9mIGFsbGUgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPkN1ckluY2lTdGF0ZVJlY2FsYygKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAkVmVyc2lvbklEOwp9Cgo9aXRlbSBfR2V0RXZlbnRzKCkKClRoaXMgbWV0aG9kIGNoZWNrcyB3aGF0IHZhbHVlcyB3ZXJlIGNoYW5nZWQgYW5kIHdoYXQgZXZlbnRzIGhhdmUgdG8gYmUgdHJpZ2dlcmVkLgpJdCByZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBhbGwgZXZlbnQgbmFtZXMgYXMga2V5cyB0aGF0IHNob3VsZCBiZSB0cmlnZ2VyZWQuCgogICAgbXkgJEV2ZW50cyA9ICRDSU9iamVjdC0+X0dldEV2ZW50cygKICAgICAgICBQYXJhbSA9PiB7CiAgICAgICAgICAgIERlcGxTdGF0ZUlEID0+IDEyMywKICAgICAgICB9LAogICAgICAgIENvbmZpZ0l0ZW1JbmZvID0+IHsKICAgICAgICAgICAgRGVwbFN0YXRlSUQgPT4gMjM0LAogICAgICAgIH0sCiAgICApOwoKICAgIHByaW50IGtleXMgJXskRXZlbnRzfTsgIyBwcmludHMgIkRlcGxveW1lbnRTdGF0ZVVwZGF0ZSIKCj1jdXQKCnN1YiBfR2V0RXZlbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSW5mbyBQYXJhbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRXZlbnRzID0ge307CgogICAgIyBjaGVjayBvbGQgYW5kIG5ldyBuYW1lCiAgICBteSAkT2xkTmFtZSA9ICRQYXJhbXtDb25maWdJdGVtSW5mb30tPntOYW1lfSB8fCAnJzsKICAgIG15ICROZXdOYW1lID0gJFBhcmFte1BhcmFtfS0+e05hbWV9ICAgICAgICAgIHx8ICcnOwoKICAgIGlmICggJE9sZE5hbWUgbmUgJE5ld05hbWUgKSB7CiAgICAgICAgJEV2ZW50cy0+e05hbWVVcGRhdGV9ID0gJE5ld05hbWUgLiAnJSUnIC4gJE9sZE5hbWU7CiAgICB9CgogICAgIyBpZiBkZXBsX3N0YXRlIGlzIHVwZGF0ZWQKICAgIG15ICRMYXN0RGVwbFN0YXRlSUQgPSAkUGFyYW17Q29uZmlnSXRlbUluZm99LT57RGVwbFN0YXRlSUR9IHx8ICcnOwogICAgbXkgJEN1ckRlcGxTdGF0ZUlEICA9ICRQYXJhbXtQYXJhbX0tPntEZXBsU3RhdGVJRH0gICAgICAgICAgfHwgJyc7CgogICAgaWYgKCAkTGFzdERlcGxTdGF0ZUlEIG5lICRDdXJEZXBsU3RhdGVJRCApIHsKICAgICAgICAkRXZlbnRzLT57RGVwbG95bWVudFN0YXRlVXBkYXRlfSA9ICRDdXJEZXBsU3RhdGVJRCAuICclJScgLiAkTGFzdERlcGxTdGF0ZUlEOwogICAgfQoKICAgICMgaWYgaW5jaXN0YXRlIGlzIHVwZGF0ZWQKICAgIG15ICRMYXN0SW5jaVN0YXRlSUQgPSAkUGFyYW17Q29uZmlnSXRlbUluZm99LT57SW5jaVN0YXRlSUR9IHx8ICcnOwogICAgbXkgJEN1ckluY2lTdGF0ZUlEICA9ICRQYXJhbXtQYXJhbX0tPntJbmNpU3RhdGVJRH0gICAgICAgICAgfHwgJyc7CgogICAgaWYgKCAkTGFzdEluY2lTdGF0ZUlEIG5lICRDdXJJbmNpU3RhdGVJRCApIHsKICAgICAgICAkRXZlbnRzLT57SW5jaWRlbnRTdGF0ZVVwZGF0ZX0gPSAkQ3VySW5jaVN0YXRlSUQgLiAnJSUnIC4gJExhc3RJbmNpU3RhdGVJRDsKICAgIH0KCiAgICAjIGNoZWNrIG9sZCBhbmQgbmV3IGRlZmluaXRpb25faWQKICAgIG15ICRPbGREZWZpbml0aW9uSUQgPSAkUGFyYW17Q29uZmlnSXRlbUluZm99LT57RGVmaW5pdGlvbklEfSB8fCAnJzsKICAgIG15ICROZXdEZWZpbml0aW9uSUQgPSAkUGFyYW17UGFyYW19LT57RGVmaW5pdGlvbklEfSAgICAgICAgICB8fCAnJzsKCiAgICBpZiAoICRPbGREZWZpbml0aW9uSUQgbmUgJE5ld0RlZmluaXRpb25JRCApIHsKICAgICAgICAkRXZlbnRzLT57RGVmaW5pdGlvblVwZGF0ZX0gPSAkTmV3RGVmaW5pdGlvbklEOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGNoYW5nZXMgaW4gWE1MIGRhdGEKICAgIGlmICggJFBhcmFte1BhcmFtfS0+e1hNTERhdGF9ICYmIHJlZiAkUGFyYW17UGFyYW19LT57WE1MRGF0YX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBteSAlQ2hhbmdlcyA9ICRTZWxmLT5fRmluZENoYW5nZWRWYWx1ZXMoICV7ICRQYXJhbXtQYXJhbX0gfSApOwogICAgICAgIGlmICgga2V5cyAlQ2hhbmdlcyApIHsKICAgICAgICAgICAgJEV2ZW50cy0+e1ZhbHVlVXBkYXRlfSA9IFwlQ2hhbmdlczsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRFdmVudHM7Cn0KCj1pdGVtIFZlcnNpb25EZWxldGUoKQoKZGVsZXRlIGFuIGV4aXN0aW5nIHZlcnNpb24gb3IgdmVyc2lvbnMKCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uRGVsZXRlKAogICAgICAgIFZlcnNpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBWZXJzaW9uRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggISRQYXJhbXtWZXJzaW9uSUR9ICYmICEkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVmVyc2lvbklEIG9yIENvbmZpZ0l0ZW1JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRWZXJzaW9uTGlzdCA9IFtdOwogICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSApIHsKCiAgICAgICAgcHVzaCBAeyRWZXJzaW9uTGlzdH0sICRQYXJhbXtWZXJzaW9uSUR9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHZlcnNpb24gbGlzdAogICAgICAgICRWZXJzaW9uTGlzdCA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIXNjYWxhciBAeyRWZXJzaW9uTGlzdH07CgogICAgIyBkZWxldGUgdGhlIHhtbCB2ZXJzaW9uIGRhdGEKICAgIGZvciBteSAkVmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRTZWxmLT5fWE1MVmVyc2lvbkRlbGV0ZSgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkVmVyc2lvbklEICggQHskVmVyc2lvbkxpc3R9ICkgewogICAgICAgICRWZXJzaW9uSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRWZXJzaW9uSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB2ZXJzaW9uIGlkIHN0cmluZwogICAgbXkgJFZlcnNpb25JRFN0cmluZyA9IGpvaW4gJywnLCBAeyRWZXJzaW9uTGlzdH07CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gaWQgZm9yIHZlcnNpb24gKG5lZWRlZCBmb3IgZXZlbnQgaGFuZGxpbmcpCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewogICAgICAgICRDb25maWdJdGVtSUQgPSAkU2VsZi0+VmVyc2lvbkNvbmZpZ0l0ZW1JREdldCgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgdmVyc2lvbnMKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIFdIRVJFIGlkIElOICggJFZlcnNpb25JRFN0cmluZyApIiwKICAgICk7CgogICAgIyB0cmlnZ2VyIFZlcnNpb25EZWxldGUgZXZlbnQgd2hlbiBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bAogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKCBAeyRWZXJzaW9uTGlzdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5Db25maWdJdGVtRXZlbnRIYW5kbGVyUG9zdCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdWZXJzaW9uRGVsZXRlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkVmVyc2lvbklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgY2FjaGUKICAgICAgICAgICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkdldH0tPnskVmVyc2lvbklEfTsKICAgICAgICAgICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VmVyc2lvbkNvbmZpZ0l0ZW1JREdldH0tPnskVmVyc2lvbklEfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBWZXJzaW9uU2VhcmNoKCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYW4gYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvblNlYXJjaCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RoZSBOYW1lJywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzc0lEcyAgICAgPT4gWyA5LCA4LCA3LCA2IF0sICAjIChvcHRpb25hbCkKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAzMjEsIDEyMyBdLCAgICAjIChvcHRpb25hbCkKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCgogICAgICAgIE9yZGVyQnkgPT4gJ05hbWUnLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgQ29uZmlnSXRlbUlECiAgICAgICAgIyAoQ29uZmlnSXRlbUlELCBOYW1lLCBDbGFzc0lELCBEZXBsU3RhdGVJRCwgSW5jaVN0YXRlSUQpCgogICAgICAgIExpbWl0ICAgICAgICAgID0+IDEyMiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CiAgICAgICAgJFBhcmFte1VzaW5nV2lsZGNhcmRzfSA9IDE7CiAgICB9CiAgICAkUGFyYW17T3JkZXJCeX0gfHw9ICdpZCc7CgogICAgIyBhZGQgbmFtZSB0byBzcWwgd2hlcmUgYXJyYXkKICAgIG15IEBTUUxXaGVyZTsKICAgIGlmICggJFBhcmFte05hbWV9ICkgewoKICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgbmFtZQogICAgICAgIG15ICROYW1lID0gJFBhcmFte05hbWV9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJE5hbWUgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE5hbWUpOwoKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIHByZXBhcmUgbGlrZSBzdHJpbmcKICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCROYW1lICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIkxPV0VSKHZyLm5hbWUpIExJS0UgTE9XRVIoJyROYW1lJykiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJMT1dFUih2ci5uYW1lKSA9IExPV0VSKCckTmFtZScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgQ2xhc3NJRHMgICAgID0+ICdjaS5pZCA9IHZyLmNvbmZpZ2l0ZW1faWQgQU5EIGNpLmNsYXNzX2lkJywKICAgICAgICBEZXBsU3RhdGVJRHMgPT4gJ3ZyLmRlcGxfc3RhdGVfaWQnLAogICAgICAgIEluY2lTdGF0ZUlEcyA9PiAndnIuaW5jaV9zdGF0ZV9pZCcsCiAgICApOwoKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICEkUGFyYW17JEFycmF5UGFyYW19OwoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFycmF5UGFyYW19IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJyYXlQYXJhbSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiBxeywgfSwgQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRBcnJheVBhcmFtc3sgJEFycmF5UGFyYW0gfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBhZGQgcHJldmlvdXMgdmVyc2lvbiBwYXJhbQogICAgaWYgKCAhJFBhcmFte1ByZXZpb3VzVmVyc2lvblNlYXJjaH0gKSB7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICdjaS5sYXN0X3ZlcnNpb25faWQgPSB2ci5pZCc7CiAgICB9CgogICAgIyBjcmVhdGUgd2hlcmUgc3RyaW5nCiAgICBteSAkV2hlcmVTdHJpbmcgPSBAU1FMV2hlcmUgPyAnIFdIRVJFICcgLiBqb2luIHF7IEFORCB9LCBAU1FMV2hlcmUgOiAnJzsKCiAgICAjIGRlZmluZSBvcmRlciB0YWJsZQogICAgbXkgJU9yZGVyQnlUYWJsZSA9ICgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJ3ZyLmNvbmZpZ2l0ZW1faWQnLAogICAgICAgIE5hbWUgICAgICAgICA9PiAndnIubmFtZScsCiAgICAgICAgQ2xhc3NJRCAgICAgID0+ICdjaS5jbGFzc19pZCcsCiAgICAgICAgRGVwbFN0YXRlSUQgID0+ICd2ci5kZXBsX3N0YXRlX2lkJywKICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJ3ZyLmluY2lfc3RhdGVfaWQnLAogICAgKTsKCiAgICAjIHNldCBvcmRlciBieQogICAgbXkgJE9yZGVyQnkgPSAkT3JkZXJCeVRhYmxleyAkUGFyYW17T3JkZXJCeX0gfSB8fCAkT3JkZXJCeVRhYmxle0NvbmZpZ0l0ZW1JRH07CgogICAgIyBzZXQgbGltaXQKICAgIGlmICggJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAkUGFyYW17TGltaXR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TGltaXR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUKHZyLmNvbmZpZ2l0ZW1faWQpICIKICAgICAgICAgICAgLiAiRlJPTSBjb25maWdpdGVtIGNpLCBjb25maWdpdGVtX3ZlcnNpb24gdnIgIgogICAgICAgICAgICAuICIkV2hlcmVTdHJpbmcgT1JERVIgQlkgJE9yZGVyQnkgQVNDIiwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1pdGVtIF9DaGVja1ZhbHVlcygpCgpUaGlzIG1ldGhvZCBjYWxsZXMgZm9yIGVhY2ggY2hhbmdlIHZhbHVlIG9mIHRoZSBjb25maWcgaXRlbSB0aGUgZXZlbnQgaGFuZGxlci4KUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG9ubHkgaGFuZGxlcyB2YWx1ZXMgaW5zaWRlIHRoZSBYTUwgc3RydWN0dXJlLCBub3QgZ2VuZXJhbAphdHRyaWJ1dGVzIGxpa2UgIkN1ckluY2lTdGF0ZSIuCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPl9DaGVja1ZhbHVlcygKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfQ2hlY2tWYWx1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVwZGF0ZVZhbHVlcyBDb25maWdJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBWYWx1ZVVwZGF0ZSBldmVudCBmb3IgZWFjaCBjaGFuZ2VkIHZhbHVlCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte1VwZGF0ZVZhbHVlc30gfSApIHsKICAgICAgICAkU2VsZi0+Q29uZmlnSXRlbUV2ZW50SGFuZGxlclBvc3QoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdWYWx1ZVVwZGF0ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRLZXkgLiAnJSUnIC4gJFBhcmFte1VwZGF0ZVZhbHVlc30tPnskS2V5fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRmluZENoYW5nZWRWYWx1ZXMoKQoKQzxfRmluZENoYW5nZWRWYWx1ZXM+IGNoZWNrcyBmb3IgZWFjaCBmb3VuZCBUYWdLZXksIGlmIGl0cyB2YWx1ZSBjaGFuZ2VkIGluIHRoZQpjdXJyZW50IHZlcnNpb24uIElmIHNvLCB0aGUgVGFnS2V5IGFuZCB0aGUgbmV3IHZhbHVlIGlzIHN0b3JlZCBpbiBhIGhhc2guIFRoaXMKaGFzaCBpcyByZXR1cm5lZC4uLgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fRmluZENoYW5nZWRWYWx1ZXMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMywKICAgICAgICBOZXdWZXJzaW9uSUQgPT4gMTIzNDUsCiAgICAgICAgT2xkVmVyc2lvbklEID0+IDEyMzQ0LAogICAgKTsKCj1jdXQKCnN1YiBfRmluZENoYW5nZWRWYWx1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgWE1MRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhIGxpc3Qgd2l0aCBhbGwgdmVyc2lvbm51bWJlcnMgdGhhdCBleGlzdCBmb3IgdGhlCiAgICAjIGdpdmVuIGNvbmZpZyBpdGVtCiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+VmVyc2lvbkxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICAjIHNraXAgdGhlIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIGl0ZW0KICAgIHJldHVybiBpZiBzY2FsYXIgQHskVmVyc2lvbkxpc3R9ID09IDA7CgogICAgIyBnZXQgb2xkIHZlcnNpb24KICAgIG15ICRPbGRWZXJzaW9uID0gJFNlbGYtPlZlcnNpb25HZXQoCiAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uTGlzdC0+Wy0xXSwKICAgICk7CgogICAgbXkgJEN1cnJlbnRYTUxEYXRhID0gJFBhcmFte1hNTERhdGF9OwogICAgbXkgJE9sZFhNTERhdGEgICAgID0gJE9sZFZlcnNpb24tPntYTUxEYXRhfTsKCiAgICAjIGdldCBhbGwgdGFna2V5cyBpbiB4bWwgZGF0YQogICAgbXkgQFRhZ0tleXNOZXcgPSAkU2VsZi0+X0dyYWJUYWdLZXlzKCBEYXRhID0+ICRDdXJyZW50WE1MRGF0YSApOwogICAgbXkgQFRhZ0tleXNPbGQgPSAkU2VsZi0+X0dyYWJUYWdLZXlzKCBEYXRhID0+ICRPbGRYTUxEYXRhICk7CgogICAgIyBzYXZlIGFsbCBleGlzdGluZyB0YWcga2V5cyBpbiBvbmUgaGFzaAogICAgbXkgJVRhZ0tleXM7CiAgICBAVGFnS2V5c3sgQFRhZ0tleXNOZXcsIEBUYWdLZXlzT2xkIH0gPSAoIEBUYWdLZXlzTmV3LCBAVGFnS2V5c09sZCApOwoKICAgICMgZG8gdGhlIGNoZWNrCiAgICBteSAlQ2hhbmdlczsKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICgga2V5cyAlVGFnS2V5cyApIHsKICAgICAgICBteSAkTmV3VmFsdWUgPSBldmFsICckQ3VycmVudFhNTERhdGEtPicgLiAkS2V5IC4gJy0+e0NvbnRlbnR9JyB8fCAnJzsKICAgICAgICBteSAkT2xkVmFsdWUgPSBldmFsICckT2xkWE1MRGF0YSAtPicgLiAkS2V5IC4gJy0+e0NvbnRlbnR9JyAgICB8fCAnJzsKCiAgICAgICAgbmV4dCBLRVkgaWYgJE5ld1ZhbHVlIGVxICRPbGRWYWx1ZTsKCiAgICAgICAgJENoYW5nZXN7JEtleX0gPSBqb2luICclJScsICRPbGRWYWx1ZSwgJE5ld1ZhbHVlOwogICAgfQoKICAgIHJldHVybiAlQ2hhbmdlczsKfQoKPWl0ZW0gX0dyYWJUYWdLZXlzKCkKClRoaXMgbWV0aG9kIGNoZWNrcyBhIHBlcmwgZGF0YXN0cnVjdHVyZSBmb3IgdGhlIEhhc2gga2V5ICdUYWdLZXknIGFuZCByZXR1cm5zIGEKbGlzdCBvZiBhbGwgVGFnS2V5cy4KCiAgICBteSBATGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fR3JhYlRhZ0tleXMoCiAgICAgICAgJFhNTEhhc2hSZWZlcmVueiwKICAgICk7Cgo9Y3V0CgpzdWIgX0dyYWJUYWdLZXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbXMgKSA9IEBfOwoKICAgIHJldHVybiAoKSBpZiAhJFBhcmFtc3tEYXRhfTsKCiAgICBteSBAVGFnS2V5czsKICAgIGlmICggcmVmICRQYXJhbXN7RGF0YX0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgRUxFTToKICAgICAgICBmb3IgbXkgJEVsZW0gKCBAeyAkUGFyYW1ze0RhdGF9IH0gKSB7CgogICAgICAgICAgICBuZXh0IEVMRU0gaWYgISRFbGVtOwogICAgICAgICAgICBuZXh0IEVMRU0gaWYgIXJlZiAkRWxlbTsKCiAgICAgICAgICAgIHB1c2ggQFRhZ0tleXMsICRTZWxmLT5fR3JhYlRhZ0tleXMoIERhdGEgPT4gJEVsZW0gKTsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCByZWYgJFBhcmFtc3tEYXRhfSBlcSAnSEFTSCcgKSB7CgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW1ze0RhdGF9IH0gKSB7CgogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ1RhZ0tleScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBUYWdLZXlzLCAkUGFyYW1ze0RhdGF9LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJFBhcmFtc3tEYXRhfS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGFnS2V5cywgJFNlbGYtPl9HcmFiVGFnS2V5cyggRGF0YSA9PiAkUGFyYW1ze0RhdGF9LT57JEtleX0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFRhZ0tleXM7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE1ICQgJERhdGU6IDIwMDkvMDkvMDIgMTE6MDQ6MjUgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1MLnBtIC0gc3ViIG1vZHVsZSBvZiBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIHhtbCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFhNTC5wbSx2IDEuNyAyMDA5LzA4LzE5IDIyOjQ4OjE0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTCAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFhNTFZhbHVlTG9va3VwKCkKCmxvb2t1cCBhIHhtbCB2YWx1ZQoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiAnJyBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBsb29rdXAgaXRlbSB2YWx1ZQogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gWE1MU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJFZhbHVlID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBjcmVhdGUgc3RhdHMgYXR0cmlidXRlIGFycmF5CiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIFhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBzZWFyY2ggZGF0YSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJENvbmZpZ0l0ZW1PYmplY3QtPlhNTEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBJdGVtICA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiA1LAogICAgKTsKCj1jdXQKCnN1YiBYTUxFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19IHx8ICggJFBhcmFte0l0ZW19ICYmIHJlZiAkUGFyYW17SXRlbX0gbmUgJ0hBU0gnICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgcHJlcGFyZSB2YWx1ZQogICAgbXkgJEFycmF5ID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSglUGFyYW0pOwoKICAgIHJldHVybiAkQXJyYXk7Cn0KCj1pdGVtIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHhtbCBkYXRhIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MRXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gWE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIHNlYXJjaCBkYXRhIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+WE1MSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFhNTEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gfHwgKCAkUGFyYW17SXRlbX0gJiYgcmVmICRQYXJhbXtJdGVtfSBuZSAnSEFTSCcgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBwcmVwYXJlIHZhbHVlCiAgICBteSAkQXJyYXkgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCVQYXJhbSk7CgogICAgcmV0dXJuICRBcnJheTsKfQoKPWl0ZW0gWE1MSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgeG1sIGRhdGEgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5YTUxJbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gNSwKICAgICk7Cgo9Y3V0CgpzdWIgWE1MSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSB8fCAoICRQYXJhbXtJdGVtfSAmJiByZWYgJFBhcmFte0l0ZW19IG5lICdIQVNIJyApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIHByZXBhcmUgdmFsdWUKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoJVBhcmFtKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBfWE1MVmVyc2lvblNlYXJjaCgpCgpzZWFyY2ggeG1sIGRhdGEgb2YgYSB2ZXJzaW9uIGFuZCByZXR1cm4gYSBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRWZXJzaW9uSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9YTUxWZXJzaW9uU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFsxLCAyLCAzXSwgICMgKG9wdGlvbmFsKQoKICAgICAgICBXaGF0ID0+IFsKICAgICAgICAgICAgIyBlYWNoIGFycmF5IGVsZW1lbnQgaXMgYSBhbmQgY29uZGl0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgb3IgY29uZGl0aW9uIGluIGhhc2gKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QSUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRBJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJbJV17J0VsZW1lbnRBJ31bJV17J0VsZW1lbnRCJ31bJV17J0NvbnRlbnQnfSIgPT4gJyVjb250ZW50QiUnLAogICAgICAgICAgICAgICAgIlslXXsnRWxlbWVudEEnfVslXXsnRWxlbWVudEMnfVslXXsnQ29udGVudCd9IiA9PiAnJWNvbnRlbnRCJScsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyB1c2UgYXJyYXkgcmVmZXJlbmNlIGlmIGRpZmZlcmVudCBjb250ZW50IHdpdGggc2FtZSBrZXkgd2FzIHNlYXJjaGVkCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qid9WyVdeydDb250ZW50J30iID0+IFsKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRDJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RCUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEUlJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiWyVdeydFbGVtZW50QSd9WyVdeydFbGVtZW50Qyd9WyVdeydDb250ZW50J30iID0+IFsKICAgICAgICAgICAgICAgICAgICAnJWNvbnRlbnRDJScsCiAgICAgICAgICAgICAgICAgICAgJyVjb250ZW50RCUnLAogICAgICAgICAgICAgICAgICAgICclY29udGVudEUlJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKCiAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtXaGF0fSB8fCByZWYgJFBhcmFte1doYXR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFdoYXQgYXMgYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlIGxpa2Ugc3RyaW5nCiAgICBmb3IgbXkgJFJvdyAoIEB7ICRQYXJhbXtXaGF0fSB9ICkgewoKICAgICAgICBWQUxVRVM6CiAgICAgICAgZm9yIG15ICRWYWx1ZXMgKCB2YWx1ZXMgJXskUm93fSApIHsKCiAgICAgICAgICAgIG5leHQgVkFMVUVTIGlmICEkVmFsdWVzOwoKICAgICAgICAgICAgIyB2YWx1ZXMgaXMgYW4gYXJyYXkKICAgICAgICAgICAgaWYgKCByZWYgJFZhbHVlcyBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9QcmVwYXJlTGlrZVN0cmluZyggXCRWYWx1ZSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV4dCBWQUxVRVM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5fUHJlcGFyZUxpa2VTdHJpbmcoIFwkVmFsdWVzICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtDbGFzc0lEc30gfHwgcmVmICRQYXJhbXtDbGFzc0lEc30gbmUgJ0FSUkFZJyB8fCAhQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gPSBrZXlzICV7JENsYXNzTGlzdH07CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRDbGFzc0lEICggQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJENsYXNzSUQsICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgc2VhcmNoIGluIGFjdGl2ZSB2ZXJzaW9ucwogICAgbXkgJVZlcnNpb25JRHM7CiAgICBmb3IgbXkgJENsYXNzSUQgKCBAeyAkUGFyYW17Q2xhc3NJRHN9IH0gKSB7CgogICAgICAgICMgc3RhcnQgeG1sIHNlYXJjaAogICAgICAgIG15IEBLZXlzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKAogICAgICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokQ2xhc3NJRCIsCiAgICAgICAgICAgIFdoYXQgPT4gJFBhcmFte1doYXR9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGFsbCBpZHMgdG8gdmVyc2lvbiBpZCBoYXNoCiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKEBLZXlzKSB7CiAgICAgICAgICAgICRWZXJzaW9uSURzeyRWZXJzaW9uSUR9ID0gMQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVWZXJzaW9uSURzIGlmICEkUGFyYW17UHJldmlvdXNWZXJzaW9uU2VhcmNofTsKCiAgICAjIHNlYXJjaCBhbHNvIGluIG9sZCB2ZXJzaW9ucyAoYXJjaGl2KQogICAgZm9yIG15ICRDbGFzc0lEICggQHsgJFBhcmFte0NsYXNzSURzfSB9ICkgewoKICAgICAgICAjIHN0YXJ0IHhtbCBzZWFyY2gKICAgICAgICBteSBAS2V5cyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFNlYXJjaCgKICAgICAgICAgICAgVHlwZSA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6QXJjaGl2OjokQ2xhc3NJRCIsCiAgICAgICAgICAgIFdoYXQgPT4gJFBhcmFte1doYXR9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGFsbCBpZHMgdG8gdmVyc2lvbiBpZCBoYXNoCiAgICAgICAgZm9yIG15ICRWZXJzaW9uSUQgKEBLZXlzKSB7CiAgICAgICAgICAgICRWZXJzaW9uSURzeyRWZXJzaW9uSUR9ID0gMQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVWZXJzaW9uSURzOwp9Cgo9aXRlbSBfWE1MVmVyc2lvbkdldCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRBcnJheVJlZiA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkdldCgKICAgICAgICBDbGFzc0lEICAgPT4gMSwKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc0lEIFZlcnNpb25JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uCiAgICBteSBAWE1MID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OiRQYXJhbXtDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIFxAWE1MIGlmIEBYTUw7CgogICAgIyBnZXQgdmVyc2lvbiBmcm9tIGFyY2hpdgogICAgQFhNTCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjpBcmNoaXY6OiRQYXJhbXtDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIFxAWE1MOwp9Cgo9aXRlbSBfWE1MVmVyc2lvbkFkZCgpCgphZGQgdGhlIHhtbCBkYXRhIG9mIGEgbmV3IHZlcnNpb24gYW5kIG1vdmUgb2xkIHhtbCB2ZXJzaW9ucyBpbiBhcmNoaXYgY2xhc3MKCiAgICBteSAkWE1MSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+X1hNTFZlcnNpb25BZGQoCiAgICAgICAgQ2xhc3NJRCAgICAgID0+IDEsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDIyMiwKICAgICAgICBWZXJzaW9uSUQgICAgPT4gMTIzLAogICAgICAgIFhNTERhdGEgICAgICA9PiAkQXJyYXlSZWYsCiAgICApOwoKPWN1dAoKc3ViIF9YTUxWZXJzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzSUQgQ29uZmlnSXRlbUlEIFZlcnNpb25JRCBYTUxEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHhtbCB2ZXJzaW9uCiAgICBteSAkWE1MSUQgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiAgICAgICAgVHlwZSAgICA9PiAiSVRTTTo6Q29uZmlnSXRlbTo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBLZXkgICAgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgICAgIFhNTEhhc2ggPT4gJFBhcmFte1hNTERhdGF9LAogICAgKTsKCiAgICAjIGdldCBsYXN0IHZlcnNpb25zCiAgICBteSAkT2xkVmVyc2lvbklEcyA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgICMgRmluZCBWZXJzaW9uIHRvIG1vdmUKICAgIG15ICRNb3ZlVmVyc2lvbjsKICAgIE9MRFZFUlNJT05JRDoKICAgIGZvciBteSAkT2xkVmVyc2lvbklEICggQHskT2xkVmVyc2lvbklEc30gKSB7CiAgICAgICAgbGFzdCBPTERWRVJTSU9OSUQgaWYgJE9sZFZlcnNpb25JRCBlcSAkUGFyYW17VmVyc2lvbklEfTsKCiAgICAgICAgJE1vdmVWZXJzaW9uID0gJE9sZFZlcnNpb25JRDsKICAgIH0KCiAgICByZXR1cm4gJFhNTElEIGlmICEkTW92ZVZlcnNpb247CgogICAgIyBtb3ZlIG9sZCB2ZXJzaW9uIGluIGFyY2hpdgogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoTW92ZSgKICAgICAgICBPbGRUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokUGFyYW17Q2xhc3NJRH0iLAogICAgICAgIE9sZEtleSAgPT4gJE1vdmVWZXJzaW9uLAogICAgICAgIE5ld1R5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFBhcmFte0NsYXNzSUR9IiwKICAgICAgICBOZXdLZXkgID0+ICRNb3ZlVmVyc2lvbiwKICAgICk7CgogICAgcmV0dXJuICRYTUxJRDsKfQoKPWl0ZW0gX1hNTFZlcnNpb25EZWxldGUoKQoKZGVsZXRlIHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5fWE1MVmVyc2lvbkRlbGV0ZSgKICAgICAgICBWZXJzaW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfWE1MVmVyc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWZXJzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZlcnNpb24gZGF0YQogICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+VmVyc2lvbkdldCgKICAgICAgICBWZXJzaW9uSUQgPT4gJFBhcmFte1ZlcnNpb25JRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFZlcnNpb247CgogICAgIyBkZWxldGUgeG1sIGRhdGEgZnJvbSBhIHZlcnNpb24KICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaERlbGV0ZSgKICAgICAgICBUeXBlID0+ICJJVFNNOjpDb25maWdJdGVtOjokVmVyc2lvbi0+e0NsYXNzSUR9IiwKICAgICAgICBLZXkgID0+ICRQYXJhbXtWZXJzaW9uSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSB4bWwgZGF0YSBmcm9tIGFyY2hpdgogICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoRGVsZXRlKAogICAgICAgIFR5cGUgPT4gIklUU006OkNvbmZpZ0l0ZW06OkFyY2hpdjo6JFZlcnNpb24tPntDbGFzc0lEfSIsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17VmVyc2lvbklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkWE1MVHlwZUJhY2tlbmQoKQoKbG9hZCBhIHhtbCBpdGVtIG1vZHVsZQoKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgKTsKCj1jdXQKCnN1YiBfTG9hZFhNTFR5cGVCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBvYmplY3QgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRYTUxUeXBlQmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRYTUxUeXBlQmFja2VuZH0tPnsgJFBhcmFte1R5cGV9IH07CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OiRQYXJhbXtUeXBlfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICBpZiAoICEkQmFja2VuZE9iamVjdCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSBvYmplY3QKICAgICRTZWxmLT57Q2FjaGV9LT57TG9hZFhNTFR5cGVCYWNrZW5kfS0+eyAkUGFyYW17VHlwZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA5LzA4LzE5IDIyOjQ4OjE0ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRXZlbnQvRG9IaXN0b3J5LnBtIC0gYSBldmVudCBtb2R1bGUgZm9yIGNvbmZpZyBpdGVtcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRG9IaXN0b3J5LnBtLHYgMS4xMCAyMDA5LzA4LzI4IDE0OjA4OjE3IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkV2ZW50OjpEb0hpc3Rvcnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkV2ZW50OjpEb0hpc3RvcnkgLSBFdmVudCBoYW5kbGVyIHRoYXQgZG9lcyB0aGUgaGlzdG9yeQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgZm9yIGhpc3RvcnkuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5OwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkRG9IaXN0b3J5T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5LT5uZXcoCiAgICAgICAgQ29uZmlnSXRlbU9iamVjdCA9PiAkQ29uZmlnSXRlbU9iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBDb25maWdJdGVtT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdAogICAgICAgIE1haW5PYmplY3QgRW5jb2RlT2JqZWN0IFRpbWVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGV2ZW50LgoKICAgICREb0hpc3RvcnlPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCAgICAgICAgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgIENvbW1lbnQgICAgICA9PiAnbmV3IHZhbHVlOiAxJywKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFzIERlZmluaXRpb25DcmVhdGUgZG9lcyBub3QgYmVsb25nIHRvIGFuIGl0ZW0sIHdlIGRvbid0IGNyZWF0ZQogICAgIyBhIGhpc3RvcnkgZW50cnkKICAgIGlmICggJFBhcmFte0V2ZW50fSAmJiAkUGFyYW17RXZlbnR9IGVxICdEZWZpbml0aW9uQ3JlYXRlJyApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgRXZlbnQgVXNlcklEIENvbW1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkdWUgdG8gY29uc2lzdGVuY3kgd2l0aCB0aWNrZXQgaGlzdG9yeSwgd2UgbmVlZCBIaXN0b3J5VHlwZQogICAgJFBhcmFte0hpc3RvcnlUeXBlfSA9ICRQYXJhbXtFdmVudH07CgogICAgIyBkaXNwYXRjaCB0YWJsZSBmb3IgYWxsIGV2ZW50cwogICAgbXkgJURpc3BhdGNoZXIgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQ29uZmlnSXRlbURlbGV0ZSAgICAgID0+IFwmX0NvbmZpZ0l0ZW1EZWxldGUsCiAgICAgICAgTGlua0FkZCAgICAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgTGlua0RlbGV0ZSAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgTmFtZVVwZGF0ZSAgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgSW5jaWRlbnRTdGF0ZVVwZGF0ZSAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVwbG95bWVudFN0YXRlVXBkYXRlID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVmaW5pdGlvblVwZGF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmVyc2lvbkNyZWF0ZSAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmFsdWVVcGRhdGUgICAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgRGVmaW5pdGlvbkNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgVmVyc2lvbkRlbGV0ZSAgICAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICApOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggIWV4aXN0cyAkRGlzcGF0Y2hlcnsgJFBhcmFte0V2ZW50fSB9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnbm9uIGV4aXN0YW50IGhpc3RvcnkgdHlwZTogJyAuICRQYXJhbXtFdmVudH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBjYWxsYmFjawogICAgbXkgJFN1YiA9ICREaXNwYXRjaGVyeyAkUGFyYW17RXZlbnR9IH07CiAgICAkU2VsZi0+JFN1YiglUGFyYW0pOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ29uZmlnSXRlbURlbGV0ZSgpCgpoaXN0b3J5J3MgZXZlbnQgaGFuZGxlciBmb3IgQ29uZmlnSXRlbURlbGV0ZQoKPWN1dAoKc3ViIF9Db25maWdJdGVtRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgaGlzdG9yeQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+SGlzdG9yeURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfSGlzdG9yeUFkZCgpCgpoaXN0b3J5J3MgZGVmYXVsdCBldmVudCBoYW5kbGVyLgoKPWN1dAoKc3ViIF9IaXN0b3J5QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgaGlzdG9yeSBlbnRyeQogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRJZDogRG9IaXN0b3J5LnBtLHYgMS4xMCAyMDA5LzA4LzI4IDE0OjA4OjE3IHJlYiBFeHAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vTnVtYmVyL0F1dG9JbmNyZW1lbnQucG0gLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEF1dG9JbmNyZW1lbnQucG0sdiAxLjMgMjAwOS8wOC8xOCAyMjoxMTo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6QXV0b0luY3JlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpOdW1iZXI6OkF1dG9JbmNyZW1lbnQgLSBjb25maWcgaXRlbSBudW1iZXIgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGF1dG8gaW5jcmVtZW50IGNvbmZpZyBpdGVtIG51bWJlciBmdW5jdGlvbnMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIF9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKCkKCmNyZWF0ZSBhIG5ldyBjb25maWcgaXRlbSBudW1iZXIKCiAgICBteSAkTnVtYmVyID0gJEJhY2tlbmRPYmplY3QtPl9Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgIENsYXNzSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBfQ29uZmlnSXRlbU51bWJlckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gaWQKICAgIG15ICRTeXN0ZW1JRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgZ2V0IGN1cnJlbnQgY291bnRlcgogICAgbXkgJEN1cnJlbnRDb3VudGVyID0gJFNlbGYtPkN1cnJlbnRDb3VudGVyR2V0KAogICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgIFR5cGUgICAgPT4gJ0F1dG9JbmNyZW1lbnQnLAogICAgKSB8fCAwOwoKICAgIENJUEhFUjoKICAgIGZvciBteSAkQ2lwaGVyICggMSAuLiAxXzAwMF8wMDBfMDAwICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgbnVtYmVyCiAgICAgICAgbXkgJE51bWJlciA9ICRTeXN0ZW1JRCAuICRQYXJhbXtDbGFzc0lEfSAuIHNwcmludGYoICIlMDZkIiwgKCAkQ3VycmVudENvdW50ZXIgKyAkQ2lwaGVyICkgKTsKCiAgICAgICAgIyBmaW5kIGV4aXN0aW5nIG51bWJlcgogICAgICAgIG15ICREdWJsaWNhdGUgPSAkU2VsZi0+Q29uZmlnSXRlbU51bWJlckxvb2t1cCgKICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAkTnVtYmVyLAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0lQSEVSIGlmICREdWJsaWNhdGU7CgogICAgICAgICMgc2V0IGNvdW50ZXIKICAgICAgICAkU2VsZi0+Q3VycmVudENvdW50ZXJTZXQoCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICdBdXRvSW5jcmVtZW50JywKICAgICAgICAgICAgQ291bnRlciA9PiAoICRDdXJyZW50Q291bnRlciArICRDaXBoZXIgKSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE51bWJlcjsKICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwOS8wOC8xOCAyMjoxMTo1MiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ3VzdG9tZXIucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEN1c3RvbWVyLnBtLHYgMS42IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkN1c3RvbWVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBjdXN0b21lciBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlQ3VzdG9tZXJTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgcmV0dXJuICRDdXN0b21lclNlYXJjaExpc3R7ICRQYXJhbXtWYWx1ZX0gfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDgvMTggMjI6MTg6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZS5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGF0ZS5wbSx2IDEuNCAyMDA5LzA4LzE4IDIyOjE4OjE5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpEYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBkYXRlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZGF0ZSBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAnMjAwNy0wMy0yNicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSB8fCAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA5LzA4LzE4IDIyOjE4OjE5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRGF0ZVRpbWUucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGVUaW1lLnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkRhdGVUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RGF0ZVRpbWUgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZGF0ZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0RhdGVUaW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSBkYXRlIHRpbWUgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gJzIwMDctMDMtMjYgMjI6MDEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX0gfHwgJyc7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybjsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOS8wOC8xOCAyMjoxODoxOSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRHVtbXkucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IER1bW15LnBtLHYgMS40IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkR1bW15OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RHVtbXkgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZHVtbXkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdEdW1teScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgZHVtbXkgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnJzsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDA5LzA4LzE4IDIyOjE4OjE5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvR2VuZXJhbENhdGFsb2cucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkdlbmVyYWxDYXRhbG9nIC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIGdlbmVyYWwgY2F0YWxvZyBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgeG1sIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAjIGdldCBpdGVtIGxpc3QKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEl0ZW1MaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkSXRlbUxpc3QgbmUgJ0hBU0gnOwoKICAgIG15ICRWYWx1ZSA9ICRJdGVtTGlzdC0+eyAkUGFyYW17VmFsdWV9IH07CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgID0+ICdLZXk6OlN1YmtleScsCiAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgaXRlbSBsaXN0CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJEl0ZW1MaXN0IHx8IHt9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgIEBWYWx1ZXMgPSBncmVwIHskX30gQFZhbHVlczsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBnZXQgaXRlbSBsaXN0CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICByZXR1cm4gJEl0ZW1MaXN0LT57ICRQYXJhbXtWYWx1ZX0gfSB8fCAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgIEBWYWx1ZXMgPSBncmVwIHskX30gQFZhbHVlczsKCiAgICByZXR1cm4gXEBWYWx1ZXM7Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBnZXQgaXRlbSBsaXN0CiAgICBteSAkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57Q2xhc3N9IHx8ICcnLAogICAgKTsKCiAgICAjIHJldmVyc2UgdGhlIGxpc3QKICAgIG15ICVJdGVtTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEl0ZW1MaXN0fTsKCiAgICByZXR1cm4gJEl0ZW1MaXN0UmV2ZXJzZXsgJFBhcmFte1ZhbHVlfSB9IHx8IHVuZGVmOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDkvMDgvMTggMjI6MTg6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvSW50ZWdlci5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSW50ZWdlci5wbSx2IDEuNSAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpJbnRlZ2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6SW50ZWdlciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBpbnRlZ2VyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgaW50ZWdlciBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm47Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dC5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGV4dC5wbSx2IDEuNiAyMDA5LzA5LzAzIDEzOjUxOjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dEFyZWEucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRleHRBcmVhLnBtLHYgMS42IDIwMDkvMDkvMDMgMTM6NTE6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlRleHRBcmVhOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dEFyZWEgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgdGV4dGFyZWEgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDkvMDMgMTM6NTE6MTYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNQ29uZmlnSXRlbS5wbSAtIHRvIGxpbmsgY29uZmlnIGl0ZW0gb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0ucG0sdiAxLjEyIDIwMDkvMDgvMTggMjI6MTg6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IExpbmtPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0xpc3RXaXRoRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMaW5rTGlzdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0gfSApIHsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICgga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uIGRhdGEKICAgICAgICAgICAgICAgIG15ICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgY29uZmlnIGl0ZW0gY2FuIG5vdCBnZXQKICAgICAgICAgICAgICAgIGlmICggISRWZXJzaW9uRGF0YSB8fCByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJyB8fCAhJXskVmVyc2lvbkRhdGF9ICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JENvbmZpZ0l0ZW1JRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdmVyc2lvbiBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JENvbmZpZ0l0ZW1JRH0gPSAkVmVyc2lvbkRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICJDb25maWdJdGVtIyAxMjM0NDU1IiwKICAgICAgICBMb25nICAgPT4gIkNvbmZpZ0l0ZW0jIDEyMzQ0NTU6IFRoZSBDb25maWcgSXRlbSBUaXRsZSIsCiAgICApOwoKICAgICVEZXNjcmlwdGlvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3REZXNjcmlwdGlvbkdldCgKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERlc2NyaXB0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBLZXkgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgbXkgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAnQ29uZmlnSXRlbScsCiAgICAgICAgTG9uZyAgID0+ICdDb25maWdJdGVtJywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICBteSAkVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFZlcnNpb25EYXRhOwogICAgcmV0dXJuIGlmIHJlZiAkVmVyc2lvbkRhdGEgbmUgJ0hBU0gnOwogICAgcmV0dXJuIGlmICEleyRWZXJzaW9uRGF0YX07CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gIkNvbmZpZ0l0ZW0jICRWZXJzaW9uRGF0YS0+e051bWJlcn0iLAogICAgICAgIExvbmcgICA9PiAiQ29uZmlnSXRlbSMgJFZlcnNpb25EYXRhLT57TnVtYmVyfTogJFZlcnNpb25EYXRhLT57TmFtZX0iLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTdWJPYmplY3QgICAgPT4gJzI1JywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMKICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9IHx8PSB7fTsKCiAgICAjIHNldCBmb2N1cwogICAgbXkgJVNlYXJjaDsKICAgIGZvciBteSAkRWxlbWVudCAocXcoTnVtYmVyIE5hbWUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgJFNlYXJjaHskRWxlbWVudH0gPSAnKicgLiAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSAuICcqJzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1N1Yk9iamVjdH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgd2l0aCB0aGUgZGVmYXVsdCBzdWJvYmplY3RzCiAgICAgICAgbXkgJERlZmF1bHRTdWJvYmplY3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6RGVmYXVsdFN1Yk9iamVjdCcpIHx8IHt9OwoKICAgICAgICAjIGV4dHJhY3QgZGVmYXVsdCBjbGFzcyBuYW1lCiAgICAgICAgbXkgJERlZmF1bHRDbGFzcyA9ICREZWZhdWx0U3Vib2JqZWN0LT57SVRTTUNvbmZpZ0l0ZW19IHx8ICcnOwoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRDbGFzc0xpc3Q7CiAgICAgICAgcmV0dXJuIGlmIHJlZiAkQ2xhc3NMaXN0IG5lICdIQVNIJzsKCiAgICAgICAgIyBsb29rdXAgdGhlIGNsYXNzIGlkCiAgICAgICAgbXkgJUNsYXNzTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JENsYXNzTGlzdH07CiAgICAgICAgJFBhcmFte1N1Yk9iamVjdH0gPSAkQ2xhc3NMaXN0UmV2ZXJzZXskRGVmYXVsdENsYXNzfSB8fCAnJzsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtTdWJPYmplY3R9OwoKICAgICMgc2VhcmNoIHRoZSBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtSURzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICV7ICRQYXJhbXtTZWFyY2hQYXJhbXN9IH0sCiAgICAgICAgJVNlYXJjaCwKICAgICAgICBDbGFzc0lEcyAgICAgICAgICAgICAgPT4gWyAkUGFyYW17U3ViT2JqZWN0fSBdLAogICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAwLAogICAgICAgIFVzaW5nV2lsZGNhcmRzICAgICAgICA9PiAxLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICBMaW1pdCAgICAgICAgICAgICAgICAgPT4gNTAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggQHskQ29uZmlnSXRlbUlEc30gKSB7CgogICAgICAgICMgZ2V0IGxhc3QgdmVyc2lvbiBkYXRhCiAgICAgICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uRGF0YTsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJFZlcnNpb25EYXRhIG5lICdIQVNIJzsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJXskVmVyc2lvbkRhdGF9OwoKICAgICAgICAjIGFkZCB2ZXJzaW9uIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRDb25maWdJdGVtSUR9ID0gJFZlcnNpb25EYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBMaW5rQWRkIGV2ZW50CiAgICBteSAkS2V5ICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUV2ZW50SGFuZGxlclBvc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIEV2ZW50ICAgICAgICA9PiAnTGlua0FkZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENvbW1lbnQgICAgICA9PiAkS2V5IC4gJyUlJyAuICRPYmplY3QsCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUG9zdCgpCgpsaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyaWdnZXIgTGlua0RlbGV0ZSBldmVudAogICAgbXkgJEtleSAgICA9ICRQYXJhbXtUYXJnZXRLZXl9ICAgIHx8ICRQYXJhbXtTb3VyY2VLZXl9OwogICAgbXkgJE9iamVjdCA9ICRQYXJhbXtUYXJnZXRPYmplY3R9IHx8ICRQYXJhbXtTb3VyY2VPYmplY3R9OwoKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1FdmVudEhhbmRsZXJQb3N0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICBFdmVudCAgICAgICAgPT4gJ0xpbmtEZWxldGUnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDb21tZW50ICAgICAgPT4gJEtleSAuICclJScgLiAkT2JqZWN0LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ29uZmlnSXRlbS5wbSAtIGFsbCBkeW5hbWljIGl0c20gY29uZmlnIGl0ZW0gc3RhdHMgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbS5wbSx2IDEuMyAyMDA5LzA3LzIwIDIzOjI2OjM3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJ0lUU01Db25maWdJdGVtJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyBjcmVhdGUgb2JqZWN0IGF0dHJpYnV0ZSBhcnJheQogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDbGFzcycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ0NsYXNzSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdEZXBsb3ltZW50IFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJERlcGxTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDaGFuZ2UgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NoYW5nZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NvbmZpZ0l0ZW1DaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ29uZmlnSXRlbUNoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIHRoZSB4bWwgZGF0YQogICAgQ0xBU1NJRDoKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgICAgICAjIGdldCB4bWwgZGVmaW5pdGlvbiBoYXNoCiAgICAgICAgbXkgJFhNTERlZmluaXRpb24gPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0xBU1NJRCBpZiAhJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9OwoKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgT2JqZWN0QXR0cmlidXRlcyA9PiBcQE9iamVjdEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gICAgPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICA9PiAnWE1MOjonIC4gJENsYXNzSUQsCiAgICAgICAgICAgIFByZWZpeE5hbWUgICAgICAgPT4gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIF9YTUxBdHRyaWJ1dGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtPYmplY3RBdHRyaWJ1dGVzfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1hNTERlZmluaXRpb259OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJzsKCiAgICBpZiAoICRQYXJhbXtQcmVmaXh9ICkgewogICAgICAgICRQYXJhbXtQcmVmaXh9IC49ICc6Oic7CiAgICB9CiAgICBpZiAoICRQYXJhbXtQcmVmaXhOYW1lfSApIHsKICAgICAgICAkUGFyYW17UHJlZml4TmFtZX0gLj0gJzo6JzsKICAgIH0KCiAgICAkUGFyYW17TGV2ZWx9ICAgICAgfHw9IDA7CiAgICAkUGFyYW17UHJlZml4fSAgICAgfHw9ICcnOwogICAgJFBhcmFte1ByZWZpeE5hbWV9IHx8PSAnJzsKCiAgICBJVEVNOgogICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntTZWFyY2hhYmxlfSAmJiAhJEl0ZW0tPntTdWJ9OwoKICAgICAgICAjIGNyZWF0ZSBrZXkgYW5kIG5hbWUKICAgICAgICBteSAkS2V5ICA9ICRQYXJhbXtQcmVmaXh9IC4gJEl0ZW0tPntLZXl9OwogICAgICAgIG15ICROYW1lID0gJFBhcmFte1ByZWZpeE5hbWV9IC4gJEl0ZW0tPntOYW1lfTsKCiAgICAgICAgIyBhZGQgYXR0cmlidXRlCiAgICAgICAgbXkgJEF0dHJpYnV0ZSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlhNTFN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgICAgICBLZXkgID0+ICRLZXksCiAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkQXR0cmlidXRlOwogICAgICAgIG5leHQgSVRFTSBpZiByZWYgJEF0dHJpYnV0ZSBuZSAnQVJSQVknOwogICAgICAgIG5leHQgSVRFTSBpZiAhc2NhbGFyIEB7JEF0dHJpYnV0ZX07CgogICAgICAgICMgYWRkIGF0dHJpYnV0ZXMgdG8gb2JqZWN0IGFycmF5CiAgICAgICAgcHVzaCBAeyAkUGFyYW17T2JqZWN0QXR0cmlidXRlc30gfSwgQHskQXR0cmlidXRlfTsKCiAgICAgICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICMgc3RhcnQgcmVjdXJzaW9uLCBpZiAiU3ViIiB3YXMgZm91bmQKICAgICAgICAkU2VsZi0+X1hNTEF0dHJpYnV0ZUFkZCgKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgIExldmVsICAgICAgICAgPT4gJFBhcmFte0xldmVsfSArIDEsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgUHJlZml4TmFtZSAgICA9PiAkTmFtZSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBsaW1pdAogICAgJFBhcmFte0xpbWl0fSA9IDFfMDAwXzAwMDsKCiAgICAjIGV4dHJhY3QgYWxsIHhtbCBwYXJhbSBrZXlzIGZyb20gdGhlIHBhcmFtIGhhc2gKICAgIG15IEBYTUxQYXJhbXMgPSBncmVwIHsgJF8gPX4gbXtcQSBYTUw6On14bXMgfSBrZXlzICVQYXJhbTsKCiAgICBpZiAoQFhNTFBhcmFtcykgewogICAgICAgIHJldHVybiAnWW91IG11c3QgZGVmaW5lZCBhIGNsYXNzIGluIG9uZSBheGlzLicgaWYgISRQYXJhbXtDbGFzc0lEc307CiAgICAgICAgcmV0dXJuICdZb3UgbXVzdCBkZWZpbmVkIGEgY2xhc3MgaW4gb25lIGF4aXMuJyBpZiByZWYgJFBhcmFte0NsYXNzSURzfSBuZSAnQVJSQVknOwogICAgfQoKICAgIG15ICVYTUxDbGFzc0lEczsKICAgIGZvciBteSAkUGFyYW1LZXkgKEBYTUxQYXJhbXMpIHsKCiAgICAgICAgIyBleHRyYWN0IHNlYXJjaCB2YWx1ZXMKICAgICAgICBteSAkU2VhcmNoVmFsdWVzID0gJFBhcmFteyRQYXJhbUtleX07CgogICAgICAgICMgcHJlcGFyZSBwYXJhbSB2YWx1ZQogICAgICAgIGlmICggIXJlZiAkU2VhcmNoVmFsdWVzICkgewogICAgICAgICAgICAkU2VhcmNoVmFsdWVzID0gWyRTZWFyY2hWYWx1ZXNdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBpZiAhQHskU2VhcmNoVmFsdWVzfTsKCiAgICAgICAgIyBzcGxpdCBwYXJhbSBrZXkKICAgICAgICBteSAoICRDbGFzc0lELCAkU2VhcmNoS2V5ICkgPSAkUGFyYW1LZXkgPX4gbXsgXEEgWE1MOjogKCBcZCsgKSA6OiAoLispIFx6IH14bXM7CgogICAgICAgICMgcHJlcGFyZSBzZWFyY2gga2V5CiAgICAgICAgJFNlYXJjaEtleSA9fiBzWyA6OiBdWyd9WyVdeyddeG1zZzsKCiAgICAgICAgIyBBZGQgY2xhc3MgaWQgdG8geG1sIGNsYXNzIGlkIGhhc2gKICAgICAgICAkWE1MQ2xhc3NJRHN7JENsYXNzSUR9ID0gMTsKCiAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGhhc2gKICAgICAgICBteSAkU2VhcmNoSGFzaCA9IHsKICAgICAgICAgICAgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFNlYXJjaEtleSAuICdcJ31bJV17XCdDb250ZW50XCd9JyA9PiAkU2VhcmNoVmFsdWVzLAogICAgICAgIH07CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1doYXR9IH0sICRTZWFyY2hIYXNoOwogICAgfQoKICAgIGlmICglWE1MQ2xhc3NJRHMpIHsKICAgICAgICBteSBARXhpc3RzID0gZ3JlcCB7ICRYTUxDbGFzc0lEc3skX30gfSBAeyAkUGFyYW17Q2xhc3NJRHN9IH07CgogICAgICAgIHJldHVybiAwIGlmICFARXhpc3RzOwogICAgfQoKICAgICMgc3RhcnQgY29uZmlnIGl0ZW0gZXh0ZW5kZWQgc2VhcmNoCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCglUGFyYW0pOwoKICAgIHJldHVybiBzY2FsYXIgQHskQ29uZmlnSXRlbUlEc307Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEltcG9ydEV4cG9ydE9iamVjdElUU01Db25maWdJdGVtLnQgLSBhbGwgaW1wb3J0IGV4cG9ydCB0ZXN0cyBmb3IgdGhlIElUU01Db25maWdJdGVtIG9iamVjdCBiYWNrZW5kCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnRPYmplY3RJVFNNQ29uZmlnSXRlbS50LHYgMS4yIDIwMDkvMDUvMTggMDk6NTc6MjEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgokU2VsZi0+e0VuY29kZU9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0KICAgID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1hNTE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgYWRkIHNvbWUgdGVzdCB0ZW1wbGF0ZXMgZm9yIGxhdGVyIGNoZWNrcwpteSBAVGVtcGxhdGVJRHM7CmZvciAoIDEgLi4gMzAgKSB7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgRm9ybWF0ICA9PiAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIE9iamVjdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgojIGNoZWNrIG9iamVjdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9iamVjdExpc3QxICYmIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnICYmICRPYmplY3RMaXN0MS0+e0lUU01Db25maWdJdGVtfSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IE9iamVjdExpc3QoKSAtIElUU01Db25maWdJdGVtIGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBvYmplY3QgYXR0cmlidXRlcwpteSAkT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgb2JqZWN0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldDEgJiYgcmVmICRPYmplY3RBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZ2V0IGNsYXNzIGxpc3QKbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJE9iamVjdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDbGFzc0lEJywKICAgICAgICBOYW1lICA9PiAnQ2xhc3MnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ291bnRNYXgnLAogICAgICAgIE5hbWUgID0+ICdNYXhpbXVtIG51bWJlciBvZiBvbmUgZWxlbWVudCcsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJzEwJywKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFJlZ2V4ICAgICAgICA9PiBxcnsgXEEgXGQrIFx6IH14bXMsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gNSwKICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDUsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQpteSAkT2JqZWN0QXR0cmlidXRlc0dldER1bXAxID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJE9iamVjdEF0dHJpYnV0ZXNHZXQxKTsKCiMgZHVtcCB0aGUgcmVmZXJlbmNlIHRhYmxlCm15ICRPYmplY3RBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkT2JqZWN0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwoKJFNlbGYtPlRydWUoCiAgICAkT2JqZWN0QXR0cmlidXRlc0dldER1bXAxIGVxICRPYmplY3RBdHRyaWJ1dGVzUmVmRHVtcDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBPYmplY3RBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBvYmplY3QgYXR0cmlidXRlcwpteSAkT2JqZWN0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJE9iamVjdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQxIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9iamVjdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDIgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldDIsCiAgICAiVGVzdCAkVGVzdENvdW50OiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucyB0byB0ZXN0IEV4cG9ydERhdGFHZXQoKSBhbmQgSW1wb3J0RGF0YVNhdmUoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkR2VuZXJhbENhdGFsb2dDbGFzcyA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgojIGFkZCBhIGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKZm9yIG15ICROYW1lIChxdyhUZXN0MSBUZXN0MiBUZXN0MyBUZXN0NCkpIHsKCiAgICAjIGFkZCBhIG5ldyBpdGVtCiAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkR2VuZXJhbENhdGFsb2dDbGFzcywKICAgICAgICBOYW1lICAgID0+ICROYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaXRlbSBpZAogICAgaWYgKCAhJEl0ZW1JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtLiIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBkZWZpbmUgdGhlIGZpcnN0IHRlc3QgZGVmaW5pdGlvbiAoYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMpCm15IEBDb25maWdJdGVtRGVmaW5pdGlvbnM7CiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMF0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdDdXN0b21lcjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0N1c3RvbWVyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnRGF0ZVRpbWUxJywKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlIFRpbWUgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdEYXRlVGltZScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0R1bW15MScsCiAgICAgICAgTmFtZSAgPT4gJ0R1bW15IDEnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRHVtbXknLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0dlbmVyYWxDYXRhbG9nMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnR2VuZXJhbENhdGFsb2cgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBDbGFzcyA9PiAnJEdlbmVyYWxDYXRhbG9nQ2xhc3MnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0ludGVnZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdJbnRlZ2VyIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnVGV4dDEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHQgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdUZXh0QXJlYTEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RleHRBcmVhIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICB9LApdICI7CgojIGRlZmluZSB0aGUgc2Vjb25kIHRlc3QgZGVmaW5pdGlvbiAoc3ViIGRhdGEgdHlwZXMpCiRDb25maWdJdGVtRGVmaW5pdGlvbnNbMV0gPSAiIFsKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMScsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMScsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIxU3ViU3ViMicsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMSBTdWJTdWIgMicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMVN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAxIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMicsCiAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4yU3ViMScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDIgU3ViIDEnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMlN1YjInLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyIFN1YiAyJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKXSAiOwoKIyBhZGQgdGhlIHRlc3QgY2xhc3NlcwpteSBAQ29uZmlnSXRlbUNsYXNzSURzOwpteSBAQ29uZmlnSXRlbURlZmluaXRpb25JRHM7CmZvciBteSAkRGVmaW5pdGlvbiAoQENvbmZpZ0l0ZW1EZWZpbml0aW9ucykgewoKICAgICMgZ2VuZXJhdGUgYSByYW5kb20gbmFtZQogICAgbXkgJENsYXNzTmFtZSA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgIyBhZGQgYW4gdW5pdHRlc3QgY29uZmlnIGl0ZW0gY2xhc3MKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGNsYXNzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDbGFzc0lEOwoKICAgICMgYWRkIGEgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uQWRkKAogICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgZGVmaW5pdGlvbiBpZAogICAgaWYgKCAhJERlZmluaXRpb25JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGRlZmluaXRpb24uIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzLCAkRGVmaW5pdGlvbklEOwp9CgojIGNyZWF0ZSBzb21lIHJhbmRvbSBudW1iZXJzCm15IEBDb25maWdJdGVtTnVtYmVyczsKZm9yICggMSAuLiAxMCApIHsKICAgIHB1c2ggQENvbmZpZ0l0ZW1OdW1iZXJzLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdApteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlRGVwbFN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9OwoKIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdApteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKKTsKbXkgJUluY2lTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKCiMgZ2V0IGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKbXkgJEdlbmVyYWxDYXRhbG9nTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAopOwpteSAlR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskR2VuZXJhbENhdGFsb2dMaXN0fTsKCiMgZGVmaW5lIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbXMgPSAoCgogICAgIyBjb25maWcgaXRlbSBmb3IgYWxsIHByb3ZpZGVkIGRhdGEgdHlwZXMKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGEgc2Vjb25kIGNvbmZpZyBpdGVtIGZvciBhbGwgcHJvdmlkZWQgZGF0YSB0eXBlcwogICAgIyAoZHVwbGljYXRlIG5hbWUgb2YgZmlyc3QgdmVyc2lvbiBmb3Igc2VhcmNoIGNoZWNrcykKICAgIHsKICAgICAgICBDb25maWdJdGVtID0+IHsKICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMV0sCiAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVmVyc2lvbnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsICAgICMgZHVwbGljYXRlIG5hbWUgZm9yIHRlc3RzCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDgtMDItMDEgMDM6NTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0MSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdUZXN0IFRleHQgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdVbml0VGVzdDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMi0wMiAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0Mn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3QgVGV4dCBUZXN0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXJlYTEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiVGVzdDJcblRleHQgQXJyYXlcblRlc3QgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ01haW4xICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnTWFpbjEgKDEpIFN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQnID0+ICdNYWluMiAoMSkgU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudCcgPT4gJ01haW4yICgxKSBTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGNvbmZpZyBpdGVtIGZvciBzdWIgZWxlbWVudCB0ZXN0cwogICAgewogICAgICAgIENvbmZpZ0l0ZW0gPT4gewogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBWZXJzaW9ucyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMSA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxU3ViU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIHNwZWNpYWwgY2hhcmFjdGVyIHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnIiI7Ozo6Li4tLV9fIyMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGVzdCBUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJUZXN0XG5UZXN0XHRUZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAoKICAgICMgY29uZmlnIGl0ZW0gZm9yIFVURi04IHRlc3RzCiAgICB7CiAgICAgICAgQ29uZmlnSXRlbSA9PiB7CiAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFZlcnNpb25zID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn4oaCIOKFuyDihZsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgPT4gJ+KYhCDihq4g4oa5IOKGkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4xU3ViMVN1YlN1YjEgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAn4oKkIOKCoSDigqkg4oKvIOKCtScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluMVN1YjFTdWJTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KZiiDimYgg4pmJIOKZiiDimYsg4pmNIOKZkScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjFTdWIyID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ+KciCDinaQg4piuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAn1Yog1YQg1YAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbjJTdWIxID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ8KuIMKpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4yU3ViMiA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICfjgYsg44GSIOOCkicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKKTsKCiMgYWRkIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpteSBAQ29uZmlnSXRlbUlEczsKZm9yIG15ICRDb25maWdJdGVtIChAQ29uZmlnSXRlbXMpIHsKCiAgICAjIGFkZCBhIGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUFkZCgKICAgICAgICAleyAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW19IH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZmlnIGl0ZW0gaWQKICAgIGlmICggISRDb25maWdJdGVtSUQgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBjb25maWcgaXRlbS4iLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJENvbmZpZ0l0ZW1JRDsKCiAgICAjIGFkZCB0aGUgdmVyc2lvbnMKICAgIGZvciBteSAkVmVyc2lvbiAoIEB7ICRDb25maWdJdGVtLT57VmVyc2lvbnN9IH0gKSB7CgogICAgICAgICMgYWRkIGEgdmVyc2lvbgogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAleyRWZXJzaW9ufSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB2ZXJzaW9uIGlkCiAgICAgICAgaWYgKCAhJFZlcnNpb25JRCApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHZlcnNpb24uIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRFeHBvcnREYXRhVGVzdHMgPSBbCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBJbXBvcnREYXRhR2V0IGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBjbGFzcyBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1stMV0gKyAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbWFwcGluZyBsaXN0IGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG51bWJlciBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmFtZSBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2FzZSBpbnNlbnNpdGl2ZSBuYW1lIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ3VuaXR0ZXN0IC0gY29uZmlnaXRlbSAxIHZlcnNpb24gMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAkQ29uZmlnSXRlbU51bWJlcnNbMF0gXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuYW1lIGFuZCBudW1iZXIgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGRlcGxveW1lbnQgc3RhdGUgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1sxXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGluY2lkZW50IHN0YXRlIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzFdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY29tYmluZWQgc2VhcmNoIGNoZWNrKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFhNTCBkYXRhIHNlYXJjaCBjaGVjaykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIERhdGUxICAgICAgICAgICA9PiAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICBUZXh0QXJlYTEgICAgICAgPT4gIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICAgICAgQ3VzdG9tZXIxICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICBUZXh0MSAgICAgICAgICAgPT4gJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgIERhdGVUaW1lMSAgICAgICA9PiAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICBJbnRlZ2VyMSAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgR2VuZXJhbENhdGFsb2cxID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QxfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICRDb25maWdJdGVtTnVtYmVyc1swXSBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNvbWJpbmVkIGFsbCBzZWFyY2ggY2hlY2spCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEcyAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgRGF0ZTEgICAgICAgICAgID0+ICcyMDA4LTAyLTAxJywKICAgICAgICAgICAgICAgIFRleHRBcmVhMSAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheVxuVGVzdCIsCiAgICAgICAgICAgICAgICBDdXN0b21lcjEgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgIFRleHQxICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgRGF0ZVRpbWUxICAgICAgID0+ICcyMDA4LTAyLTAxIDAzOjU5JywKICAgICAgICAgICAgICAgIEludGVnZXIxICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBHZW5lcmFsQ2F0YWxvZzEgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDF9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHJldHVybmVkIGFycmF5KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEdW1teTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0dlbmVyYWxDYXRhbG9nMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW50ZWdlcjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXlcblRlc3QiLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGRvdWJsZSBlbGVtZW50IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEdW1teTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0R1bW15MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHQxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0QXJlYTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VFeHBvcnREYXRhID0+IFsKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzBdLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMSAwMzo1OScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJ1Rlc3QxJywKICAgICAgICAgICAgICAgICdUZXN0MScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnMScsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFRlc3QnLAogICAgICAgICAgICAgICAgJ1Rlc3QgVGV4dCBUZXN0JywKICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5XG5UZXN0IiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzdWIgZWxlbWVudCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgyKSBTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHN1YiBlbGVtZW50IGNoZWNrcyB3aXRoIHVuZGVmIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjo0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIxOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjozJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMyBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDEpIFN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xICgxKSBTdWIxICgxKSBTdWJTdWIxICgzKScsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMSkgU3ViU3ViMiAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjEgKDIpIFN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMSAoMikgU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMSAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMSAoMSknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIFN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMiAoMSkgU3ViMiAoMiknLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzdWIgZWxlbWVudCBjaGVja3Mgd2l0aCB1bmRlZiB2YWx1ZXMgYW5kIGVtcHR5IHN0cmluZ3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6NCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMTo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbM10sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUV4cG9ydERhdGEgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDUgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnLAogICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywKICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnVGVzdCBUZXN0JywKICAgICAgICAgICAgICAgICJUZXN0XG5UZXN0XHRUZXN0IiwKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzVdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRXhwb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1XSwKICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gNiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICfihoIg4oW7IOKFmycsCiAgICAgICAgICAgICAgICAn4piEIOKGriDihrkg4oaSJywKICAgICAgICAgICAgICAgICfigqQg4oKhIOKCqSDigq8g4oK1JywKICAgICAgICAgICAgICAgICfimYog4pmIIOKZiSDimYog4pmLIOKZjSDimZEnLAogICAgICAgICAgICAgICAgJ+KciCDinaQg4piuJywKICAgICAgICAgICAgICAgICfViiDVhCDVgCcsCiAgICAgICAgICAgICAgICAnwq4gwqknLAogICAgICAgICAgICAgICAgJ+OBiyDjgZIg44KSJywKICAgICAgICAgICAgXSwKICAgICAgICBdLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEV4cG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VFeHBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VFeHBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCB0aGUgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57T2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e09iamVjdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgb2JqZWN0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBPYmplY3REYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntPYmplY3REYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57TWFwcGluZ09iamVjdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gZXEgJ0FSUkFZJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKICAgICAgICBNQVBQSU5HT0JKRUNUREFUQToKICAgICAgICBmb3IgbXkgJE1hcHBpbmdPYmplY3REYXRhICggQHsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgbXkgJE1hcHBpbmdJRCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkTWFwcGluZ09iamVjdERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB0aGUgc2VhcmNoIGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57U2VhcmNoRGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e1NlYXJjaERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgc2VhcmNoIGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTZWFyY2hEYXRhID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntTZWFyY2hEYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJFNlbGYtPntPYmplY3RCYWNrZW5kT2JqZWN0fS0+RXhwb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkRXhwb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkRXhwb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRFeHBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VFeHBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFHZXQoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgZXhwb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkRXhwb3J0Um93ICggQHskRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlRXhwb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRFeHBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gZXhwb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRFeHBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpIC0gY29ycmVjdCBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEV4cG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBJbXBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIEltcG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gW10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbXBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGltcG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2xhc3MgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNsYXNzIGlkIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWy0xXSArIDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbWFwcGluZyBsaXN0IGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG1vcmUgdGhhbiBvbmUgaWRlbnRpZmllciB3aXRoIHRoZSBzYW1lIG5hbWUgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJzEyMycsICczMjEnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpZGVudGlmaWVyIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpZGVudGlmaWVyIGlzIHVuZGVmIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFt1bmRlZl0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBib3RoIGlkZW50aWZpZXJzIGFyZSBlbXB0eSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBib3RoIGlkZW50aWZpZXJzIGFyZSB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgdW5kZWYsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgaWRlbnRpZmllcnMgaXMgZW1wdHksIG9uZSBpcyB1bmRlZiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnMTIzJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG9uZSBvZiB0aGUgaWRlbnRpZmllcnMgaXMgdW5kZWYgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcxMjMnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgb25lIG9mIHRoZSBpZGVudGlmaWVycyBpcyBlbXB0eSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ051bWJlcicsCiAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsgJycsICcxMjMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIGlzIGVtcHR5IChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJzEyMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRPRE8gQWRkIHNvbWUgaWRlbnRpZmllciB0ZXN0cwoKICAgICMgZW1wdHkgbmFtZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICcnLCAnUHJvZHVjdGlvbicsICdPcGVyYXRpb25hbCcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgZGVwbG95bWVudCBzdGF0ZSBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSW1wb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgSW1wb3J0RGF0YVJvdyA9PiBbICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMScsICdEdW1teScsICdPcGVyYXRpb25hbCcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgaW5jaWRlbnQgc3RhdGUgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RlcGxTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnSW5jaVN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWyAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDInLCAnUHJvZHVjdGlvbicsICdEdW1teScgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIE5FVyBjb25maWcgaXRlbSBtdXN0IGJlIGNyZWF0ZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ3VzdG9tZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEYXRlMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZVRpbWUxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdHZW5lcmFsQ2F0YWxvZzE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0ludGVnZXIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdUZXh0MTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dEFyZWExOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wNi0wNScsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDgtMDUgMDQ6NTAnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MycsCiAgICAgICAgICAgICAgICAgICAgJzMnLAogICAgICAgICAgICAgICAgICAgICdUZXN0MyBUZXh0MyBUZXN0MycsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QzXG5UZXh0QXJyYXkzXG5UZXN0MyIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAxLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEltcG9ydHRlc3QgMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgJ0N1c3RvbWVyMTo6MScgICAgICAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgICAgICdEYXRlMTo6MScgICAgICAgICAgID0+ICcyMDA4LTA2LTA1JywKICAgICAgICAgICAgICAgICdEYXRlVGltZTE6OjEnICAgICAgID0+ICcyMDA4LTA4LTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICdHZW5lcmFsQ2F0YWxvZzE6OjEnID0+ICRHZW5lcmFsQ2F0YWxvZ0xpc3RSZXZlcnNle1Rlc3QzfSwKICAgICAgICAgICAgICAgICdJbnRlZ2VyMTo6MScgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICdUZXh0MTo6MScgICAgICAgICAgID0+ICdUZXN0MyBUZXh0MyBUZXN0MycsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdDNcblRleHRBcnJheTNcblRlc3QzIiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIHNlY29uZCBORVcgY29uZmlnIGl0ZW0gbXVzdCBiZSBjcmVhdGVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBPYmplY3REYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFwcGluZ09iamVjdERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDQnLAogICAgICAgICAgICAgICAgICAgICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDktMDUnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTEyLTA1IDA0OjUwJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDQnLAogICAgICAgICAgICAgICAgICAgICc0JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDQgVGV4dDQgVGVzdDQnLAogICAgICAgICAgICAgICAgICAgICJUZXN0NFxuVGV4dEFycmF5NFxuVGVzdDQiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMSwKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBJbXBvcnR0ZXN0IDQnLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wOS0wNScsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0xMi0wNSAwNDo1MCcsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0NH0sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnNCcsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdDQgVGV4dDQgVGVzdDQnLAogICAgICAgICAgICAgICAgJ1RleHRBcmVhMTo6MScgICAgICAgPT4gIlRlc3Q0XG5UZXh0QXJyYXk0XG5UZXN0NCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIGZpcnN0IHRlc3QgY29uZmlnIGl0ZW0pCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgJ1BpbG90JywKICAgICAgICAgICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJzIwMDgtMDItMDInLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAyIDAzOjU5JywKICAgICAgICAgICAgICAgICAgICAnVGVzdDInLAogICAgICAgICAgICAgICAgICAgICcyJywKICAgICAgICAgICAgICAgICAgICAnVGVzdCBUZXh0IFVQREFURTEgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMVxuVGVzdCIsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAyLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICAgICAgPT4gJ1BpbG90JywKICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAnQ3VzdG9tZXIxOjoxJyAgICAgICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgJ0RhdGUxOjoxJyAgICAgICAgICAgPT4gJzIwMDgtMDItMDInLAogICAgICAgICAgICAgICAgJ0RhdGVUaW1lMTo6MScgICAgICAgPT4gJzIwMDgtMDItMDIgMDM6NTknLAogICAgICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nMTo6MScgPT4gJEdlbmVyYWxDYXRhbG9nTGlzdFJldmVyc2V7VGVzdDJ9LAogICAgICAgICAgICAgICAgJ0ludGVnZXIxOjoxJyAgICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgJ1RleHQxOjoxJyAgICAgICAgICAgPT4gJ1Rlc3QgVGV4dCBVUERBVEUxIFRlc3QnLAogICAgICAgICAgICAgICAgJ1RleHRBcmVhMTo6MScgICAgICAgPT4gIlRlc3RcblRleHQgQXJyYXkgVVBEQVRFMVxuVGVzdCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIGZpcnN0IHRlc3QgY29uZmlnIGl0ZW0gYWdhaW4pCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0N1c3RvbWVyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGF0ZTE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0RhdGVUaW1lMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnR2VuZXJhbENhdGFsb2cxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbnRlZ2VyMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnVGV4dDE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ1RleHRBcmVhMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAxIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1JlcGFpcicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QnLAogICAgICAgICAgICAgICAgICAgICcyMDA4LTAyLTAzJywKICAgICAgICAgICAgICAgICAgICAnMjAwOC0wMi0wMyAwMzo1OScsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QzJywKICAgICAgICAgICAgICAgICAgICAnMycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGV4dCBVUERBVEUyIFRlc3QnLAogICAgICAgICAgICAgICAgICAgICJUZXN0XG5UZXh0IEFycmF5IFVQREFURTJcblRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDEgVmVyc2lvbiAzJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgID0+ICdSZXBhaXInLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdDdXN0b21lcjE6OjEnICAgICAgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgICAgICAnRGF0ZTE6OjEnICAgICAgICAgICA9PiAnMjAwOC0wMi0wMycsCiAgICAgICAgICAgICAgICAnRGF0ZVRpbWUxOjoxJyAgICAgICA9PiAnMjAwOC0wMi0wMyAwMzo1OScsCiAgICAgICAgICAgICAgICAnR2VuZXJhbENhdGFsb2cxOjoxJyA9PiAkR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZXtUZXN0M30sCiAgICAgICAgICAgICAgICAnSW50ZWdlcjE6OjEnICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAnVGV4dDE6OjEnICAgICAgICAgICA9PiAnVGVzdCBUZXh0IFVQREFURTIgVGVzdCcsCiAgICAgICAgICAgICAgICAnVGV4dEFyZWExOjoxJyAgICAgICA9PiAiVGVzdFxuVGV4dCBBcnJheSBVUERBVEUyXG5UZXN0IiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gdGhpcmQgdGVzdCBjb25maWcgaXRlbSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMSAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjIgKDIpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIyICgyKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKScsCiAgICAgICAgICAgICAgICAgICAgJ01haW4yICgxKSBNYWluMlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICAgICAnTWFpbjIgKDEpIE1haW4yU3ViMiAoMSknLAogICAgICAgICAgICAgICAgICAgICdNYWluMiAoMSkgTWFpbjJTdWIyICgyKScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiAyLAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMTo6MScgICAgICAgICAgICAgICA9PiAnTWFpbjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoyJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgxKSBNYWluMVN1YjFTdWJTdWIxICgyKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MycgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMSkgTWFpbjFTdWIxU3ViU3ViMSAoMyknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDEpIE1haW4xU3ViMVN1YlN1YjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyJyA9PiAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjI6Ok1haW4xU3ViMVN1YlN1YjE6OjEnID0+CiAgICAgICAgICAgICAgICAgICAgJ01haW4xICgxKSBNYWluMVN1YjEgKDIpIE1haW4xU3ViMVN1YlN1YjEgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoyOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PgogICAgICAgICAgICAgICAgICAgICdNYWluMSAoMSkgTWFpbjFTdWIxICgyKSBNYWluMVN1YjFTdWJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6Mjo6TWFpbjFTdWIxU3ViU3ViMjo6MicgPT4KICAgICAgICAgICAgICAgICAgICAnTWFpbjEgKDEpIE1haW4xU3ViMSAoMikgTWFpbjFTdWIxU3ViU3ViMiAoMiknLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnID0+ICdNYWluMSAoMSkgTWFpbjFTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MicgPT4gJ01haW4xICgxKSBNYWluMVN1YjIgKDIpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MScgICAgICAgICAgICAgICA9PiAnTWFpbjIgKDEpJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJyA9PiAnTWFpbjIgKDEpIE1haW4yU3ViMSAoMSknLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnID0+ICdNYWluMiAoMSkgTWFpbjJTdWIyICgxKScsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MicgPT4gJ01haW4yICgxKSBNYWluMlN1YjIgKDIpJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGVwbFN0YXRlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMTo6MTo6TWFpbjFTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syN10sCiAgICAgICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICAgICAgJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICAgICAgJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIFZlcnNpb25OdW1iZXIgPT4gMywKICAgICAgICAgICAgTGFzdFZlcnNpb24gICA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ29uZmlnSXRlbSAzIFZlcnNpb24gMycsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgICAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjEnICAgICAgICAgICAgICAgPT4gJyIiOzs6Oi4uLS1fXyMjJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxJyA9PiAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMjo6MScgPT4gJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICciIjs7OjouLi0tX18jIycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMTo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Rlc3QgVGVzdCcsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjE6Ok1haW4yU3ViMjo6MScgICAgICAgICAgICAgICAgICAgICAgPT4gIlRlc3RcblRlc3RcdFRlc3QiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0luY2lTdGF0ZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWFpbjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjE6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjE6OjE6Ok1haW4xU3ViMVN1YlN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01haW4yOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdNYWluMjo6MTo6TWFpbjJTdWIyOjoxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEltcG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI3XSwKICAgICAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1syXSwKICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiA0JywKICAgICAgICAgICAgICAgICAgICAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAnzqsgzrQgzrsnLAogICAgICAgICAgICAgICAgICAgICfPgCDPhyDPmCcsCiAgICAgICAgICAgICAgICAgICAgJ8+6IM+xIM+uJywKICAgICAgICAgICAgICAgICAgICAnya8gypMgyqAnLAogICAgICAgICAgICAgICAgICAgICfKrCDKrycsCiAgICAgICAgICAgICAgICAgICAgJ9C5INGEINGJJywKICAgICAgICAgICAgICAgICAgICAn0Zog0ZEnLAogICAgICAgICAgICAgICAgICAgICfRrCDRpicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgVmVyc2lvbk51bWJlciA9PiA0LAogICAgICAgICAgICBMYXN0VmVyc2lvbiAgID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDb25maWdJdGVtIDMgVmVyc2lvbiA0JywKICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgICAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICdNYWluMTo6MScgICAgICAgICAgICAgICA9PiAnzqsgzrQgzrsnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjE6OjEnID0+ICfPgCDPhyDPmCcsCiAgICAgICAgICAgICAgICAnTWFpbjE6OjE6Ok1haW4xU3ViMTo6MTo6TWFpbjFTdWIxU3ViU3ViMTo6MScgPT4gJ8+6IM+xIM+uJywKICAgICAgICAgICAgICAgICdNYWluMTo6MTo6TWFpbjFTdWIxOjoxOjpNYWluMVN1YjFTdWJTdWIyOjoxJyA9PiAnya8gypMgyqAnLAogICAgICAgICAgICAgICAgJ01haW4xOjoxOjpNYWluMVN1YjI6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfKrCDKrycsCiAgICAgICAgICAgICAgICAnTWFpbjI6OjEnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9C5INGEINGJJywKICAgICAgICAgICAgICAgICdNYWluMjo6MTo6TWFpbjJTdWIxOjoxJyAgICAgICAgICAgICAgICAgICAgICA9PiAn0Zog0ZEnLAogICAgICAgICAgICAgICAgJ01haW4yOjoxOjpNYWluMlN1YjI6OjEnICAgICAgICAgICAgICAgICAgICAgID0+ICfRrCDRpicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUT0RPIGFkZCBzb21lIHVuZGVmIGZpZWxkIHRlc3RzCiAgICAjIFRPRE8gYWRkIHNvbWUgcmVxdWlyZWQgZmllbGQgdGVzdHMKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEltcG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VJbXBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VJbXBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCB0aGUgb2JqZWN0IGRhdGEKICAgIGlmICgKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57T2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e09iamVjdERhdGF9IGVxICdIQVNIJwogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e09iamVjdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0KICAgICAgICAmJiByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e01hcHBpbmdPYmplY3REYXRhfSBlcSAnQVJSQVknCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGRlbGV0ZSBhbGwgZXhpc3RpbmcgbWFwcGluZyBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCByb3dzCiAgICAgICAgTUFQUElOR09CSkVDVERBVEE6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0RGF0YSAoIEB7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgYWRkIGEgbmV3IG1hcHBpbmcgcm93CiAgICAgICAgICAgIG15ICRNYXBwaW5nSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRNYXBwaW5nT2JqZWN0RGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaW1wb3J0IGRhdGEgc2F2ZQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57T2JqZWN0QmFja2VuZE9iamVjdH0tPkltcG9ydERhdGFTYXZlKAogICAgICAgICV7ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhU2F2ZX0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGdldCB0aGUgdmVyc2lvbiBsaXN0CiAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBjaGVjayBudW1iZXIgb2YgdmVyc2lvbnMKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskVmVyc2lvbkxpc3R9LAogICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntWZXJzaW9uTnVtYmVyfSB8fCAwLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgLSBjb3JyZWN0IG51bWJlciBvZiB2ZXJzaW9ucyIsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsYXN0IHZlcnNpb24KICAgIG15ICRWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICApOwoKICAgICMgdHJhbnNsYXRlIHhtbGRhdGEgaW4gYSAyZCBoYXNoCiAgICBteSAlWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJEKAogICAgICAgIFhNTEhhc2ggPT4gJFZlcnNpb25EYXRhLT57WE1MRGF0YX0sCiAgICApOwoKICAgICMgY2xlYW4gdGhlIHhtbCBoYXNoCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVhNTEhhc2ggKSB7CgogICAgICAgIG5leHQgS0VZIGlmICRLZXkgPX4gbXsgXHsnQ29udGVudCdcfSBceiB9eG1zOwoKICAgICAgICBkZWxldGUgJFhNTEhhc2h7JEtleX07CiAgICB9CgogICAgIyBjaGVjayBnZW5lcmFsIGVsZW1lbnRzCiAgICBFTEVNRU5UOgogICAgZm9yIG15ICRFbGVtZW50IChxdyhOdW1iZXIgTmFtZSBEZXBsU3RhdGUgSW5jaVN0YXRlKSkgewoKICAgICAgICBuZXh0IEVMRU1FTlQgaWYgIWV4aXN0cyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEVsZW1lbnR9OwoKICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlbGVtZW50CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkVmVyc2lvbkRhdGEtPnskRWxlbWVudH0sCiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskRWxlbWVudH0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFTYXZlKCkgJEVsZW1lbnQgaXMgaWRlbnRpY2FsIiwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRFbGVtZW50fTsKICAgIH0KCiAgICAjIGNoZWNrIG51bWJlciBvZiBYTUwgZWxlbWVudHMKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIga2V5cyAlWE1MSGFzaCwKICAgICAgICBzY2FsYXIga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259IH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIFhNTCBlbGVtZW50cyIsCiAgICApOwoKICAgICMgY2hlY2sgWE1MIGVsZW1lbnRzCiAgICBFTEVNRU5UOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0gfSApIHsKCiAgICAgICAgIyBkdXBsaWNhdGUga2V5CiAgICAgICAgbXkgJFhNTEtleSA9ICRLZXk7CgogICAgICAgICMgcHJlcGFyZSBrZXkKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgd2hpbGUgKCAkWE1MS2V5ID1+IG17IDo6IH14bXMgKSB7CgogICAgICAgICAgICBpZiAoICRDb3VudGVyICUgMiApIHsKICAgICAgICAgICAgICAgICRYTUxLZXkgPX4gc3sgOjogfXtdXHsnfXhtczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRYTUxLZXkgPX4gc3sgOjogfXsnXH1bfXhtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIG5leHQgRUxFTUVOVCBpZiAhZXhpc3RzICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9OwoKICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICBpZiAoICFkZWZpbmVkICRYTUxIYXNoeyAnWzFde1wnVmVyc2lvblwnfVsxXXtcJycgLiAkWE1MS2V5IC4gJ117XCdDb250ZW50XCd9JyB9ICkgewogICAgICAgICAgICAkWE1MSGFzaHsgJ1sxXXtcJ1ZlcnNpb25cJ31bMV17XCcnIC4gJFhNTEtleSAuICdde1wnQ29udGVudFwnfScgfSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfS0+e0xhc3RWZXJzaW9ufS0+eyRLZXl9ICkgewogICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT57TGFzdFZlcnNpb259LT57JEtleX0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBYTUwgZWxlbWVudAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFhNTEhhc2h7ICdbMV17XCdWZXJzaW9uXCd9WzFde1wnJyAuICRYTUxLZXkgLiAnXXtcJ0NvbnRlbnRcJ30nIH0sCiAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPntMYXN0VmVyc2lvbn0tPnskS2V5fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YVNhdmUoKSAkS2V5IGlzIGlkZW50aWNhbCIsCiAgICAgICAgKTsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVsZXRlIHRoZSB0ZXN0IHRlbXBsYXRlcwokU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgVGVtcGxhdGVJRCA9PiBcQFRlbXBsYXRlSURzLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBnZXQgYWN0dWFsIGNsYXNzIGxpc3QKJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCik7CgojIHNldCB1bml0dGVzdCBjbGFzc2VzIGludmFsaWQKSVRFTUlEOgpmb3IgbXkgJEl0ZW1JRCAoIGtleXMgJXskQ2xhc3NMaXN0fSApIHsKCiAgICBuZXh0IElURU1JRCBpZiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0gIX4gbXsgXEEgVW5pdFRlc3QgfXhtczsKCiAgICAjIHVwZGF0ZSBpdGVtCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAkQ2xhc3NMaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cn0KCiMgZGVsZXRlIHRoZSB0ZXN0IGNvbmZpZyBpdGVtcwpmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1EZWxldGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIElUU01Db25maWdJdGVtLnQgLSBjb25maWcgaXRlbSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW0udCx2IDEuNSAyMDA5LzA5LzA3IDA5OjA2OjQ1IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHBlcmZvcm0gQ29uZmlnSXRlbUNvdW50IHRvIGZpbGwgdGhlIGVtcHR5IGZpZWxkcwokU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtQ291bnQoKTsKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0lUU01Db25maWdJdGVtJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUlUU01Db25maWdJdGVtLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSVRTTUNvbmZpZ0l0ZW0tJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKbXkgJEdlbmVyYWxDYXRhbG9nQ2xhc3MgPSAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwoKIyBhZGQgYSBnZW5lcmFsIGNhdGFsb2cgdGVzdCBsaXN0CmZvciBteSAkTmFtZSAocXcoVGVzdDEgVGVzdDIgVGVzdDMgVGVzdDQpKSB7CgogICAgIyBhZGQgYSBuZXcgaXRlbQogICAgbXkgJEl0ZW1JRCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgPT4gJEdlbmVyYWxDYXRhbG9nQ2xhc3MsCiAgICAgICAgTmFtZSAgICA9PiAkTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGl0ZW0gaWQKICAgIGlmICggISRJdGVtSUQgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBnZW5lcmFsIGNhdGFsb2cgaXRlbS4iLAogICAgICAgICk7CiAgICB9Cn0KCiMgZGVmaW5lIHRoZSBmaXJzdCB0ZXN0IGRlZmluaXRpb24gKGFsbCBwcm92aWRlZCBkYXRhIHR5cGVzKQpteSBAQ29uZmlnSXRlbURlZmluaXRpb25zOwokQ29uZmlnSXRlbURlZmluaXRpb25zWzBdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnQ3VzdG9tZXIxJywKICAgICAgICBOYW1lICAgICAgID0+ICdDdXN0b21lciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdEYXRlMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0RhdGVUaW1lMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRGF0ZSBUaW1lIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZVRpbWUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdEdW1teTEnLAogICAgICAgIE5hbWUgID0+ICdEdW1teSAxJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0R1bW15JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdHZW5lcmFsQ2F0YWxvZzEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0dlbmVyYWxDYXRhbG9nIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJyRHZW5lcmFsQ2F0YWxvZ0NsYXNzJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICAgICAgID0+ICdJbnRlZ2VyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnSW50ZWdlciAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0ludGVnZXInLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ1RleHQxJywKICAgICAgICBOYW1lICAgICAgID0+ICdUZXh0IDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnVGV4dEFyZWExJywKICAgICAgICBOYW1lICAgICAgID0+ICdUZXh0QXJlYSAxJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKXSAiOwoKIyBkZWZpbmUgdGhlIHNlY29uZCB0ZXN0IGRlZmluaXRpb24gKHN1YiBkYXRhIHR5cGVzKQokQ29uZmlnSXRlbURlZmluaXRpb25zWzFdID0gIiBbCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjEnLAogICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDEnLAogICAgICAgICAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgICAgICAgICAgSW5wdXQgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgICAgICAgICAgICAgU3ViID0+IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMVN1YlN1YjEnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDEgU3ViU3ViIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgPT4gJ01haW4xU3ViMVN1YlN1YjInLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNYWluIDEgU3ViIDEgU3ViU3ViIDInLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjFTdWIyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMSBTdWIgMicsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjInLAogICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICAgID0+ICdNYWluMlN1YjEnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTWFpbiAyIFN1YiAxJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnTWFpbjJTdWIyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ01haW4gMiBTdWIgMicsCiAgICAgICAgICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgICAgICAgICBJbnB1dCAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSB0aGlyZCB0ZXN0IGRlZmluaXRpb24gKG9ubHkgZm9yIHNlYXJjaCB0ZXN0cykKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1syXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3VzdG9tZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgZGVmaW5lIHRoZSBmb3V0aCB0ZXN0IGRlZmluaXRpb24gKG9ubHkgZm9yIHNlYXJjaCB0ZXN0cykKJENvbmZpZ0l0ZW1EZWZpbml0aW9uc1szXSA9ICIgWwogICAgewogICAgICAgIEtleSAgICAgICAgPT4gJ0N1c3RvbWVyMScsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3VzdG9tZXIgMScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ICAgICAgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCl0gIjsKCiMgYWRkIHRoZSB0ZXN0IGNsYXNzZXMKbXkgQENvbmZpZ0l0ZW1DbGFzc0lEczsKbXkgQENvbmZpZ0l0ZW1DbGFzc2VzOwpteSBAQ29uZmlnSXRlbURlZmluaXRpb25JRHM7CmZvciBteSAkRGVmaW5pdGlvbiAoQENvbmZpZ0l0ZW1EZWZpbml0aW9ucykgewoKICAgICMgZ2VuZXJhdGUgYSByYW5kb20gbmFtZQogICAgbXkgJENsYXNzTmFtZSA9ICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgIyBhZGQgYW4gdW5pdHRlc3QgY29uZmlnIGl0ZW0gY2xhc3MKICAgIG15ICRDbGFzc0lEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIE5hbWUgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIGlkCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGNsYXNzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdXNoIEBDb25maWdJdGVtQ2xhc3NJRHMsICRDbGFzc0lEOwogICAgcHVzaCBAQ29uZmlnSXRlbUNsYXNzZXMsICAkQ2xhc3NOYW1lOwoKICAgICMgYWRkIGEgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uQWRkKAogICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgRGVmaW5pdGlvbiA9PiAkRGVmaW5pdGlvbiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgZGVmaW5pdGlvbiBpZAogICAgaWYgKCAhJERlZmluaXRpb25JRCApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGNvbmZpZyBpdGVtIGRlZmluaXRpb24uIiwKICAgICAgICApOwogICAgfQoKICAgIHB1c2ggQENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzLCAkRGVmaW5pdGlvbklEOwp9CgojIGNyZWF0ZSBzb21lIHJhbmRvbSBudW1iZXJzCm15IEBDb25maWdJdGVtTnVtYmVyczsKZm9yICggMSAuLiAxMDAgKSB7CiAgICBwdXNoIEBDb25maWdJdGVtTnVtYmVycywgaW50IHJhbmQgMV8wMDBfMDAwOwp9CgojIGdldCBjbGFzcyBsaXN0Cm15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwpteSAlQ2xhc3NMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKCiMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdApteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAopOwpteSAlRGVwbFN0YXRlTGlzdFJldmVyc2UgPSByZXZlcnNlICV7JERlcGxTdGF0ZUxpc3R9OwoKIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdApteSAkSW5jaVN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKKTsKbXkgJUluY2lTdGF0ZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbmNpU3RhdGVMaXN0fTsKCiMgZ2V0IGdlbmVyYWwgY2F0YWxvZyB0ZXN0IGxpc3QKbXkgJEdlbmVyYWxDYXRhbG9nTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICRHZW5lcmFsQ2F0YWxvZ0NsYXNzLAopOwpteSAlR2VuZXJhbENhdGFsb2dMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskR2VuZXJhbENhdGFsb2dMaXN0fTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBjb25maWcgaXRlbSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ29uZmlnSXRlbVRlc3RzID0gWwoKICAgICMgQ29uZmlnSXRlbUFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgQ29uZmlnSXRlbUFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY2xhc3MgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCBjb25maWcgaXRlbSB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayByZXR1cm5lZCBjb25maWcgaXRlbSB2YWx1ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExhc3RWZXJzaW9uSUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgY29uZmlnIGl0ZW0gdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgbnVtYmVyIGF0dHJpYnV0ZSkKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1swXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBjb25maWcgaXRlbSB3aXRoIHRoaXMgbnVtYmVyIGFscmVhZHkgZXhpc3RzIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBWZXJzaW9uQWRkIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMV0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzJdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMl0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgTGFzdFZlcnNpb25JRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFZlcnNpb25BZGQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAzIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1szXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgVmVyc2lvbkFkZCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzRdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDQgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgTGFzdFZlcnNpb25JRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFZlcnNpb25BZGQgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gNSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGRlcGxveW1lbnQgc3RhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybmVkIHZhbHVlcykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA2IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gOTk5OTk5OSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBMYXN0VmVyc2lvbklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgaW52YWxpZCBpbmNpZGVudCBzdGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuZWQgdmFsdWVzKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzddLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDcgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDk5OTk5OTksCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbN10sCiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgTGFzdFZlcnNpb25JRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayByZXR1cm5lZCB2YWx1ZXMpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUdldCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s4XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzhdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDggVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoZ2VuZXJhbCBjaGVjayB3aXRoIHR3byB2ZXJzaW9ucykKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s5XSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSA5IFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDkgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzldLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzldLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMSBDb25maWdJdGVtIDkgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbOV0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gOSBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIGNhbGN1bGF0aW9uIG9mIGRlcGxveW1lbnQgYW5kIGluY2lkZW50IHN0YXRlKQogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzEwXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDEgQ29uZmlnSXRlbSAxMCBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbMTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uR2V0ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gMTAgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQbGFubmVkJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcmVwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnb3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1sxMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAxIENvbmZpZ0l0ZW0gMTAgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGNvbmZpZyBpdGVtIG9ubHkgZm9yIGxhdGVyIHNlYXJjaCB0ZXN0cwogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtQWRkID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1HZXQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMl0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+ICRVc2VySURzWzJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uR2V0ID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOdW1iZXIgICAgICAgICAgID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAkVXNlcklEc1syXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgY29uZmlnIGl0ZW0gb25seSBmb3IgbGF0ZXIgc2VhcmNoIHRlc3RzCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMiBWZXJzaW9uIDInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25HZXQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMl0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAyIFZlcnNpb24gMScsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBjb25maWcgaXRlbSBvbmx5IGZvciBsYXRlciBzZWFyY2ggdGVzdHMKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbM10sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgNCBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgNCBDb25maWdJdGVtIDEgVmVyc2lvbiAxJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgICAgID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1syXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGUgICAgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdQcm9kdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkZWQgdG8gY2hlY2sgaGlzdG9yeSBmdW5jdGlvbnMKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBjYWxjdWxhdGlvbiBvZiBkZXBsb3ltZW50IGFuZCBpbmNpZGVudCBzdGF0ZSkKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUFkZCA9PiB7CiAgICAgICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyc1s3MF0sCiAgICAgICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFZlcnNpb25BZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBIaXN0b3J5VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QgVmVyc2lvbiAyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcwXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzBdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QnLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ1BsYW5uZWQnLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZVR5cGUgICAgPT4gJ3ByZXByb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZUlEICAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlVHlwZSA9PiAncHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZSAgICAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVUeXBlICAgID0+ICdvcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlSUQgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVUeXBlID0+ICdpbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcwXSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgID0+ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtQ2xhc3NJRHNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtIEhpc3RvcnlUZXN0IFZlcnNpb24gMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSGlzdG9yeUdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnVmVyc2lvbkNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA2LAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnRGVmaW5pdGlvblVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA4LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnTmFtZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiA1LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgPT4gJ1VuaXRUZXN0IC0gSGlzdG9yeVRlc3QlJScsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdJbmNpZGVudFN0YXRlVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9IC4gJyUlJywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0RlcGxveW1lbnRTdGF0ZVVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAxMCwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSAuICclJScsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdWZXJzaW9uQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDYsCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdOYW1lVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZUlEID0+IDUsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PgogICAgICAgICAgICAgICAgICAgICAgICAnVW5pdFRlc3QgLSBIaXN0b3J5VGVzdCBWZXJzaW9uIDIlJVVuaXRUZXN0IC0gSGlzdG9yeVRlc3QnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgPT4gJ0luY2lkZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gOSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gLiAnJSUnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgID0+ICdEZXBsb3ltZW50U3RhdGVVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTAsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9IC4gJyUlJwogICAgICAgICAgICAgICAgICAgICAgICAuICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQbGFubmVkfSwKICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZGVkIGZvciBCdWc0MTk2CiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgY2FsY3VsYXRpb24gb2YgZGVwbG95bWVudCBhbmQgaW5jaWRlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1BZGQgPT4gewogICAgICAgICAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzFdLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbUNsYXNzSURzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWZXJzaW9uQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle1BsYW5uZWR9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NiBWMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEID0+ICRDb25maWdJdGVtRGVmaW5pdGlvbklEc1swXSwKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdVbml0VGVzdCAtIEJ1Z2ZpeDQxOTYgVjInLAogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVW5pdFRlc3QgLSBCdWdmaXg0MTk2IFYyJywKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW1EZWZpbml0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDb25maWdJdGVtR2V0ID0+IHsKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OdW1iZXJzWzcxXSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgPT4gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbUNsYXNzSURzWzBdIH0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGUgICAgID0+ICdNYWludGVuYW5jZScsCiAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ0luY2lkZW50JywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmVyc2lvbkdldCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzFdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UGxhbm5lZH0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlICAgICAgICA9PiAnUGxhbm5lZCcsCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlVHlwZSAgICA9PiAncHJlcHJvZHVjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZSAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVUeXBlID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZVR5cGUgICAgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+ICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0sCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICAgICA9PiAnSW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ2luY2lkZW50JywKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICA9PiAkQ29uZmlnSXRlbU51bWJlcnNbNzFdLAogICAgICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRDbGFzc0xpc3QtPnsgJENvbmZpZ0l0ZW1DbGFzc0lEc1swXSB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQnVnZml4NDE5NiBWMicsCiAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbklEICAgICA9PiAkQ29uZmlnSXRlbURlZmluaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgICA9PiAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICAgICAgICAgIERlcGxTdGF0ZSAgICAgICAgPT4gJ01haW50ZW5hbmNlJywKICAgICAgICAgICAgICAgICAgICBEZXBsU3RhdGVUeXBlICAgID0+ICdwcm9kdWN0aXZlJywKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCAgID0+ICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlICAgICA9PiAnTWFpbnRlbmFuY2UnLAogICAgICAgICAgICAgICAgICAgIEN1ckRlcGxTdGF0ZVR5cGUgPT4gJ3Byb2R1Y3RpdmUnLAogICAgICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBJbmNpU3RhdGUgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgSW5jaVN0YXRlVHlwZSAgICA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZUlEICAgPT4gJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnaW5jaWRlbnQnLAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBjb25maWcgaXRlbSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKbXkgQENvbmZpZ0l0ZW1JRHM7CgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRDb25maWdJdGVtVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlRGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgZXh0cmFjdCBzb3VyY2UgZGF0YQogICAgbXkgJFNvdXJjZURhdGEgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwoKICAgICMgYWRkIGEgbmV3IGNvbmZpZyBpdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgaWYgKCAkU291cmNlRGF0YS0+e0NvbmZpZ0l0ZW1BZGR9ICkgewoKICAgICAgICAjIGFkZCB0aGUgbmV3IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q29uZmlnSXRlbUFkZH0gfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewogICAgICAgICAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSBjb25maWcgaXRlbQogICAgaWYgKCAkVGVzdC0+e1JlZmVyZW5jZURhdGF9ICYmICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENvbmZpZ0l0ZW1BZGQoKSAtIEFkZCBuZXcgY29uZmlnIGl0ZW0uIEluc2VydCBzdWNjZXNzLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUIGlmICEkQ29uZmlnSXRlbUlEOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ29uZmlnSXRlbUFkZCgpIC0gQWRkIG5ldyBjb25maWcgaXRlbS4gUmV0dXJuIGZhbHNlLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCBhbGwgZGVmaW5lZCB2ZXJzaW9ucwogICAgbXkgQFZlcnNpb25JRHM7CiAgICBteSAlVmVyc2lvbklEc1NlZW47CiAgICBpZiAoICRTb3VyY2VEYXRhLT57VmVyc2lvbkFkZH0gKSB7CgogICAgICAgIGZvciBteSAkVmVyc2lvbiAoIEB7ICRTb3VyY2VEYXRhLT57VmVyc2lvbkFkZH0gfSApIHsKCiAgICAgICAgICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbi0+e0NvbmZpZ0l0ZW1JRH0gPSAkQ29uZmlnSXRlbUlEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBhIG5ldyB2ZXJzaW9uCiAgICAgICAgICAgIG15ICRWZXJzaW9uSUQgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uQWRkKAogICAgICAgICAgICAgICAgJXskVmVyc2lvbn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFZlcnNpb25JRCkgewogICAgICAgICAgICAgICAgcHVzaCBAVmVyc2lvbklEcywgJFZlcnNpb25JRCBpZiAhJFZlcnNpb25JRHNTZWVueyRWZXJzaW9uSUR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0KICAgIG15ICRDb25maWdJdGVtRGF0YTsKICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBjb25maSBpdGVtIGRhdGEKICAgICAgICAkQ29uZmlnSXRlbURhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQ29uZmlnSXRlbURhdGEgKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDb25maWdJdGVtR2V0KCkgLSBnZXQgY29uZmlnIGl0ZW0gZGF0YS4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFsbCBjb25maWcgaXRlbSBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAleyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IGNvbnRlbnQgaWYgdmFsdWVzIGFyZSB1bmRlZgogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRDb25maWdJdGVtRGF0YS0+eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1EYXRhLT57JEF0dHJpYnV0ZX0gPSAnVU5ERUYtdW5pdHRlc3QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e0NvbmZpZ0l0ZW1HZXR9LT57JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57Q29uZmlnSXRlbUdldH0tPnskQXR0cmlidXRlfSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYXR0cmlidXRlcwogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbURhdGEtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntDb25maWdJdGVtR2V0fS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ29uZmlnSXRlbUdldCgpIC0gJEF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSB2ZXJzaW9ucwogICAgaWYgKAogICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGF0YX0KICAgICAgICAmJiAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0KICAgICAgICAmJiBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0gfQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQFZlcnNpb25JRHMsCiAgICAgICAgICAgIHNjYWxhciBAeyAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH0gfSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkFkZCgpIC0gY29ycmVjdCBudW1iZXIgb2YgdmVyc2lvbnMiLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1JRDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIHNjYWxhciBAVmVyc2lvbklEcywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkFkZCgpIC0gbm8gdmVyc2lvbnMgZXhpdHMiLAogICAgICAgICk7CiAgICB9CgogICAgbmV4dCBURVNUIGlmICEkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwogICAgbmV4dCBURVNUIGlmICEkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57VmVyc2lvbkdldH07CgogICAgbXkgJENvdW50ZXIgICAgICAgICAgID0gMDsKICAgIG15ICRMYXN0VmVyc2lvbklETXVzdCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICBWRVJTSU9OSUQ6CiAgICBmb3IgbXkgJFZlcnNpb25JRCAoQFZlcnNpb25JRHMpIHsKCiAgICAgICAgIyBnZXQgdGhpcyB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgVmVyc2lvbklEICA9PiAkVmVyc2lvbklELAogICAgICAgICAgICBYTUxEYXRhR2V0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFZlcnNpb25EYXRhICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVmVyc2lvbkdldCgpIC0gZ2V0IHZlcnNpb24gZGF0YS4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFZFUlNJT05JRDsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBsYXN0IHZlcnNpb24gaWQKICAgICAgICAkTGFzdFZlcnNpb25JRE11c3QgPSAkVmVyc2lvbkRhdGEtPntWZXJzaW9uSUR9OwoKICAgICAgICAjIGNoZWNrIGFsbCB2ZXJzaW9uIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJXsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfS0+e1ZlcnNpb25HZXR9LT5bJENvdW50ZXJdIH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIG5lZWRlZCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIG15ICRWZXJzaW9uQXR0cmlidXRlICAgPSAkVmVyc2lvbkRhdGEtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntWZXJzaW9uR2V0fS0+WyRDb3VudGVyXS0+eyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFZlcnNpb25BdHRyaWJ1dGUgKSB7CiAgICAgICAgICAgICAgICAkVmVyc2lvbkF0dHJpYnV0ZSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUmVmZXJlbmNlQXR0cmlidXRlICkgewogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnWE1MRGVmaW5pdGlvbicgfHwgJEF0dHJpYnV0ZSBlcSAnWE1MRGF0YScgKSB7CgogICAgICAgICAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgICAgICAgICAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICAgICAgICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gVmVyc2lvbkdldCgpCiAgICAgICAgICAgICAgICAkVmVyc2lvbkF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRWZXJzaW9uQXR0cmlidXRlKTsKCiAgICAgICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkUmVmZXJlbmNlQXR0cmlidXRlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBhdHRyaWJ1dGVzCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRWZXJzaW9uQXR0cmlidXRlLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFZlcnNpb25HZXQoKSAtICRBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICAjIHByZXBhcmUgbGFzdCB2ZXJzaW9uIGlkCiAgICBteSAkTGFzdFZlcnNpb25JREFjdHVhbCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICBpZiAoICRDb25maWdJdGVtRGF0YS0+e0xhc3RWZXJzaW9uSUR9ICkgewogICAgICAgICRMYXN0VmVyc2lvbklEQWN0dWFsID0gJENvbmZpZ0l0ZW1EYXRhLT57TGFzdFZlcnNpb25JRH07CiAgICB9CgogICAgIyBjaGVjayBsYXN0IHZlcnNpb24gaWQKICAgICRTZWxmLT5JcygKICAgICAgICAkQ29uZmlnSXRlbURhdGEtPntMYXN0VmVyc2lvbklEfSwKICAgICAgICAkTGFzdFZlcnNpb25JRE11c3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogbGFzdCB2ZXJzaW9uIGlkIGlkZW50aWNhbCIsCiAgICApOwoKICAgICMgY2hlY2sgaGlzdG9yeSBlbnRyaWVzCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntSZWZlcmVuY2VEYXRhfQogICAgICAgICYmICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntIaXN0b3J5R2V0fQogICAgICAgICYmIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntIaXN0b3J5R2V0fSB9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICRDb21wbGV0ZUhpc3RvcnkgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5IaXN0b3J5R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG5yIG9mIGhpc3RvcnkgZW50cmllcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0tPntIaXN0b3J5R2V0fSB9LAogICAgICAgICAgICBzY2FsYXIgQHskQ29tcGxldGVIaXN0b3J5fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogbnIgb2YgaGlzdG9yeSBlbnRyaWVzIiwKICAgICAgICApOwoKICAgICAgICBDSEVDS05SOiBmb3IgbXkgJENoZWNrTnIgKCAwIC4uICQjeyRDb21wbGV0ZUhpc3Rvcnl9ICkgewogICAgICAgICAgICBteSAkQ2hlY2sgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9LT57SGlzdG9yeUdldH0tPlskQ2hlY2tOcl07CiAgICAgICAgICAgIG15ICREYXRhICA9ICRDb21wbGV0ZUhpc3RvcnktPlskQ2hlY2tOcl07CgogICAgICAgICAgICBuZXh0IENIRUNLTlIgdW5sZXNzICRDaGVjayAmJiAkRGF0YTsKCiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyRDaGVja30gKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBoaXN0b3J5IGRhdGEKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQ2hlY2stPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAkRGF0YS0+eyRLZXl9LAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRLZXkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBjb25maWcgaXRlbSBzZWFyY2ggdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJENvbmZpZ0l0ZW1TZWFyY2hUZXN0cyA9IFsKCiAgICAjIHNlYXJjaCBBTEwgY29uZmlnIGl0ZW1zIGluIHRoZSB0d28gdGVzdCBjbGFzc2VzCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBudW1iZXIgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyID0+ICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG51bWJlciBwYXJhbSB3aXRoIHdpbGRjYXJkcwogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOdW1iZXIgPT4gJyonIC4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSAuICcqJywKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbnVtYmVyIHBhcmFtIHdpdGggd2lsZGNhcmRzIGJ1dCB3aXRoIGRlYWN0aXZhdGVkIHdpbGRjYXJkIGZlYXR1cmUKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTnVtYmVyICAgICAgICAgPT4gJyonIC4gJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSAuICcqJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSwKICAgICAgICAgICAgICAgICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgICAgICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG9yZGVyIGJ5IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBPcmRlckJ5ID0+ICdDcmVhdGVCeScsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMiwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxpbWl0IHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjcmVhdGUgYnkgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gWyAkVXNlcklEc1syXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjcmVhdGUgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDcmVhdGVCeSA9PiBbICRVc2VySURzWzFdLCAgICAgICAgICAgICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGNoYW5nZSBieSBwYXJhbSBpbiBjb21iaW5hdGlvbiBvZiB0aGUgY2xhc3MgaWQKICAgIHsKICAgICAgICBGdW5jdGlvbiA9PiBbICdDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQnLCAnQ29uZmlnSXRlbVNlYXJjaCcgXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFsxXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgY2hhbmdlIGJ5IHBhcmFtIGluIGNvbWJpbmF0aW9uIG9mIHRoZSBjbGFzcyBpZAogICAgewogICAgICAgIEZ1bmN0aW9uID0+IFsgJ0NvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCcsICdDb25maWdJdGVtU2VhcmNoJyBdLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWyAkVXNlcklEc1sxXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBjaGFuZ2UgYnkgcGFyYW0gaW4gY29tYmluYXRpb24gb2YgdGhlIGNsYXNzIGlkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gPT4gWyAnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJywgJ0NvbmZpZ0l0ZW1TZWFyY2gnIF0sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiBbICRVc2VySURzWzJdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHNlYXJjaCBBTEwgY29uZmlnIGl0ZW1zIGluIHRoZSB0d28gdGVzdCBjbGFzc2VzIHVzaW5nIHRoZSB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBuYW1lIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFRlc3QgLSBDbGFzcyAzIENvbmZpZ0l0ZW0gMSBWZXJzaW9uIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbSB3aXRoIGFuIHdpbGRjYXJkCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFRlc3QgLSAqIDEnLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbmFtZSBwYXJhbSB3aXRoIGFuIHdpbGRjYXJkIGFuZCBhIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdVbml0VGVzdCAtICogMScsCiAgICAgICAgICAgIENsYXNzSURzICAgICAgICAgICAgICA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0gd2l0aCB3aWxkY2FyZHMKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtIENsYXNzIDMqJywKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIG5hbWUgcGFyYW0gd2l0aCB3aWxkY2FyZHMgYnV0IHdpdGggZGVhY3RpdmF0ZWQgd2lsZGNhcmQgZmVhdHVyZQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdVbml0VGVzdCAtIENsYXNzIDMqJywKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGxhc3QgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lID0+ICdVbml0VGVzdCAtIENsYXNzIDMgQ29uZmlnSXRlbSAyIFZlcnNpb24gMScsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBQcmV2aW91c1ZlcnNpb25TZWFyY2ggcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1VuaXRUZXN0IC0gQ2xhc3MgMyBDb25maWdJdGVtIDIgVmVyc2lvbiAxJywKICAgICAgICAgICAgQ2xhc3NJRHMgICAgICAgICAgICAgID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBQcmV2aW91c1ZlcnNpb25TZWFyY2ggPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgbGltaXQgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgTGltaXQgPT4gMTAwLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAyLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBsaW1pdCBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7UHJvZHVjdGlvbn0sCiAgICAgICAgICAgICAgICAkRGVwbFN0YXRlTGlzdFJldmVyc2V7TWFpbnRlbmFuY2V9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtQcm9kdWN0aW9ufSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0gXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgZGVwbG95bWVudCBzdGF0ZSBwYXJhbSB3aXRoIGFjdGl2YXRlZCBwcmV2aW91cyB2ZXJzaW9uIHNlYXJjaAogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBEZXBsU3RhdGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259LAogICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxpc3RSZXZlcnNle01haW50ZW5hbmNlfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGRlcGxveW1lbnQgc3RhdGUgcGFyYW0gd2l0aCBhY3RpdmF0ZWQgcHJldmlvdXMgdmVyc2lvbiBzZWFyY2gKICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgRGVwbFN0YXRlSURzICAgICAgICAgID0+IFsgJERlcGxTdGF0ZUxpc3RSZXZlcnNle1Byb2R1Y3Rpb259IF0sCiAgICAgICAgICAgIFByZXZpb3VzVmVyc2lvblNlYXJjaCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MF0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s1MV0sCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBkZXBsb3ltZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIERlcGxTdGF0ZUlEcyAgICAgICAgICA9PiBbICREZXBsU3RhdGVMaXN0UmV2ZXJzZXtNYWludGVuYW5jZX0gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTBdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNTFdLAogICAgICAgICAgICAkQ29uZmlnSXRlbU51bWJlcnNbNjBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgdGVzdCB0aGUgaW5jaWRlbnQgc3RhdGUgcGFyYW0KICAgIHsKICAgICAgICBGdW5jdGlvbiAgID0+IFsnVmVyc2lvblNlYXJjaCddLAogICAgICAgIFNlYXJjaERhdGEgPT4gewogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRDb25maWdJdGVtQ2xhc3NJRHNbMl0sICRDb25maWdJdGVtQ2xhc3NJRHNbM10gXSwKICAgICAgICAgICAgSW5jaVN0YXRlSURzID0+IFsgJEluY2lTdGF0ZUxpc3RSZXZlcnNle09wZXJhdGlvbmFsfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgICRDb25maWdJdGVtTnVtYmVyc1s2MF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyB0ZXN0IHRoZSBpbmNpZGVudCBzdGF0ZSBwYXJhbQogICAgewogICAgICAgIEZ1bmN0aW9uICAgPT4gWydWZXJzaW9uU2VhcmNoJ10sCiAgICAgICAgU2VhcmNoRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJENvbmZpZ0l0ZW1DbGFzc0lEc1syXSwgJENvbmZpZ0l0ZW1DbGFzc0lEc1szXSBdLAogICAgICAgICAgICBJbmNpU3RhdGVJRHMgPT4gWyAkSW5jaVN0YXRlTGlzdFJldmVyc2V7SW5jaWRlbnR9IF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkSW5jaVN0YXRlTGlzdFJldmVyc2V7T3BlcmF0aW9uYWx9LAogICAgICAgICAgICAgICAgJEluY2lTdGF0ZUxpc3RSZXZlcnNle0luY2lkZW50fSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyAgICAgICAgICA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtPcGVyYXRpb25hbH0gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzYwXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIHRlc3QgdGhlIGluY2lkZW50IHN0YXRlIHBhcmFtIHdpdGggYWN0aXZhdGVkIHByZXZpb3VzIHZlcnNpb24gc2VhcmNoCiAgICB7CiAgICAgICAgRnVuY3Rpb24gICA9PiBbJ1ZlcnNpb25TZWFyY2gnXSwKICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyAkQ29uZmlnSXRlbUNsYXNzSURzWzJdLCAkQ29uZmlnSXRlbUNsYXNzSURzWzNdIF0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEcyAgICAgICAgICA9PiBbICRJbmNpU3RhdGVMaXN0UmV2ZXJzZXtJbmNpZGVudH0gXSwKICAgICAgICAgICAgUHJldmlvdXNWZXJzaW9uU2VhcmNoID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUwXSwKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXJzWzUxXSwKICAgICAgICBdLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBjb25maWcgaXRlbSBzZWFyY2ggdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskQ29uZmlnSXRlbVNlYXJjaFRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNlYXJjaERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NlYXJjaERhdGF9IHx8IHJlZiAkVGVzdC0+e1NlYXJjaERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNlYXJjaERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoICEkVGVzdC0+e0Z1bmN0aW9ufSB8fCByZWYgJFRlc3QtPntGdW5jdGlvbn0gbmUgJ0FSUkFZJyB8fCAhQHsgJFRlc3QtPntGdW5jdGlvbn0gfSApIHsKICAgICAgICAkVGVzdC0+e0Z1bmN0aW9ufSA9IFsnQ29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkJ107CiAgICB9CgogICAgZm9yIG15ICRGdW5jdGlvbiAoIEB7ICRUZXN0LT57RnVuY3Rpb259IH0gKSB7CgogICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1MaXN0ID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+JEZ1bmN0aW9uKAogICAgICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB0aGUgY29uZmlnIGl0ZW0gbGlzdAogICAgICAgIGlmICggJFRlc3QtPntSZWZlcmVuY2VEYXRhfSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1MaXN0ICYmIHJlZiAkQ29uZmlnSXRlbUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gTGlzdCBpcyBhbiBhcnJheSByZWZlcmVuY2UuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVCBpZiAhJENvbmZpZ0l0ZW1MaXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTGlzdCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRGdW5jdGlvbigpIC0gUmV0dXJuIGZhbHNlLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRFU1QgaWYgISRDb25maWdJdGVtTGlzdDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGZvdW5kZWQgY29uZmlnIGl0ZW1zCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskQ29uZmlnSXRlbUxpc3R9LAogICAgICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VEYXRhfSB9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kZWQgY29uZmlnIGl0ZW1zIiwKICAgICAgICApOwoKICAgICAgICBteSBAUmVmZXJlbmNlTGlzdDsKICAgICAgICBmb3IgbXkgJE51bWJlciAoIEB7ICRUZXN0LT57UmVmZXJlbmNlRGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgZmluZCBpZCBvZiB0aGUgaXRlbQogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSAiCiAgICAgICAgICAgICAgICAgICAgLiAiY29uZmlnaXRlbV9udW1iZXIgPSAnJE51bWJlcicgIgogICAgICAgICAgICAgICAgICAgIC4gIk9SREVSIEJZIGlkIERFU0MiLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgICAgICBteSAkQ29uZmlnSXRlbUlEOwogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW1JRCA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFJlZmVyZW5jZUxpc3QsICRDb25maWdJdGVtSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICAgICAjIGR1bXAgdGhlIGxpc3QgZnJvbSBDb25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoKQogICAgICAgIG15ICRDb25maWdJdGVtU3RyaW5nID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJENvbmZpZ0l0ZW1MaXN0KTsKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2Ugc3RyaW5nCiAgICAgICAgbXkgJFJlZmVyZW5jZVN0cmluZyA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCBcQFJlZmVyZW5jZUxpc3QgKTsKCiAgICAgICAgIyBjaGVjayBhcnJheXMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRDb25maWdJdGVtU3RyaW5nLAogICAgICAgICAgICAkUmVmZXJlbmNlU3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkRnVuY3Rpb24oKSAtIExpc3QiLAogICAgICAgICk7CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGN1cnJlbnQgY2xhc3MgbGlzdAokQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKKTsKCiMgc2V0IHVuaXR0ZXN0IGNsYXNzZXMgaW52YWxpZApJVEVNSUQ6CmZvciBteSAkSXRlbUlEICgga2V5cyAleyRDbGFzc0xpc3R9ICkgewoKICAgIG5leHQgSVRFTUlEIGlmICRDbGFzc0xpc3QtPnskSXRlbUlEfSAhfiBteyBcQSBVbml0VGVzdCB9eG1zOwoKICAgICMgdXBkYXRlIGl0ZW0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgPT4gJEl0ZW1JRCwKICAgICAgICBOYW1lICAgID0+ICRDbGFzc0xpc3QtPnskSXRlbUlEfSwKICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKfQoKIyBkZWxldGUgdGhlIHRlc3QgY29uZmlnIGl0ZW1zCmZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlEcykgewogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAE1ElEQVQ4y31VS29bRRg9M3Mfju086tiJY9dNE+XRNH3RpK0oD7GoqkoIgRAqqgRsuuIHwIINr2UlJERX7FCRUBBigRRUFllACyoqNGogtLaTmjzsxHH8uPa9vtf3zp1hQRMpTdJP+hYzn3TOmU9HZ4iUEnvV7OxsqlAovKHrevCJETFNc3N8fPzb4eHhCvYpZa/L1dXVA+l0+qPJycm3wuEwfZJ8fX3dm5mZGVYU5cOBgQFzT2Qp5Y62LIvduHHj43Q67TabTWma5q52bFvOzd13rl//4r1qtboLQ0q5W3Gr1Qr19PS8FAgE1FwuB0LIDhENswWj3oLvQ9/Y5Bdu/fL31IULZ5fbgtrTV0EIAWOMlMtl1Go1MMYeE3rILJZRsigsX4UkFKHusRenby18n183vrx08fQ3hw/3NZ664y0CSikYY/A8H5U6QXxwFH2hLngex4Gwivb2UCBfrE5kHuQ+//q73868+dqz7w8PJar7AkspQSmF7/tgTEGt7uPo+Aji8W7UmhyxAyGEdYLNmo1Hy+vIlZ1AIV97p/bVzINPP7j8WVubDrqPYMk5h6IwAAoWii7ShTqqlodQqA0CFDVbYi5XRqFi48hgHOfPDGtrdefdu39kRgBAsW0bAKiUklJKpeM4ipSSMsZACEHT9kDbwlhrCBxjGnwoWG9IlKsN/PhrGtmlEnwBBHWGVLz70J+z2VMvPH8so0xNTQ0QQo4SQpJSSs227c54PJ4Mh8NgjGF5voD+viQODyShEIl8xYbrSzzIbeDh4hrMZgsu97EJCsdkaqjbPVKrVaEUi0XueV4TQANA0HXdYDQalYZhoFTaQDazgKFwDCN9IeQKNaT/rYNqAbhcoq8vhkKxAqdSh5A+dEp90zCrQggoV69eXRVCFAAQSikMw+jKZrOvuK47aBgGIl1BuE0bC/kq1oo1rBdKMDmDFgyhpzeKQEBFT4eOzvYAmmur7uTJsblIJAIlGo1KAP62/xTFXVxcFJFIBBsbG3ju/AiW8k38dOcRfp9fRoARHB/rB2MCKpWYGOnFsUOjKJWq+Ge2ogtRHnZd7+f9XEH+d4WCWKwbvVENhUwGlmkjVzRxN7uJvxY3oFCBZ4ZiOD4YQ7xDwbnTA6xer76az+fb9/QxIQSGYaCzsxMAENApxg8C4DY2g2Foqo9YSEOEtjB//yEqKxo0hYMQgUQiee7evXtndwE7jgPXdWFZFhKJBDjn6OrqwqmTo4j3FmFaPiynhVKxgEy2jN5YEG2jB9HdHUF7ezv6+/uj09PTl3cAu66La9euKalUik1MTCAUCkFKCSEE4vE4otEoLMuCbTfhDvWAUApN06DrOlRVBaUUAEgikbi0A9jzPMzPz9NgMEg8z0O9XgfnfEccAgBjCvQAhRACvu+j0WhACLE955zHyJMhPjc3p05PT7+dTCY/SaVSyZWVFQghEAgEoCgKKKXbrwAAVVW3ybfELS8vN3e54sSJE96VK1d+YIzlt8JISgnOOXzf30M9g6Io200phRCC7OmK27dvi6WlpWYymUQikYCUEr7vQwgBz/PAOd9Owa3zFinnHJZl1clen2kul6M3b958fWFh4WXTNFXHcVTOuSqEoEIIJoQgj1VLKaUAICilnqZpXkdHhzc2NnbnP0Y4w1S6yfK4AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==
IyAtLQojIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0sdiAxLjE0IDIwMDkvMDgvMTkgMjI6NDg6MTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE0ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgc3lzY29uZmlnIG9iamVjdAogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNvbmZpZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgcmVidWlsZCBaWloqIGZpbGVzCiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0tPldyaXRlRGVmYXVsdCgpOwoKICAgICMgZGVmaW5lIHRoZSBaWlogZmlsZXMKICAgIG15IEBaWlpGaWxlcyA9ICgKICAgICAgICAnWlpaQUF1dG8ucG0nLAogICAgICAgICdaWlpBdXRvLnBtJywKICAgICk7CgogICAgIyByZWxvYWQgdGhlIFpaWiBmaWxlcyAobW9kX3Blcmwgd29ya2Fyb3VuZCkKICAgIGZvciBteSAkWlpaRmlsZSAoQFpaWkZpbGVzKSB7CgogICAgICAgIFBSRUZJWDoKICAgICAgICBmb3IgbXkgJFByZWZpeCAoQElOQykgewogICAgICAgICAgICBteSAkRmlsZSA9ICRQcmVmaXggLiAnL0tlcm5lbC9Db25maWcvRmlsZXMvJyAuICRaWlpGaWxlOwogICAgICAgICAgICBuZXh0IFBSRUZJWCBpZiAhLWYgJEZpbGU7CiAgICAgICAgICAgIGRvICRGaWxlOwogICAgICAgICAgICBsYXN0IFBSRUZJWDsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgJFNlbGYtPntDU1ZPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q1NWLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VHlwZU9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdHNPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRzLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVmaW5lIGZpbGUgcHJlZml4IGZvciBzdGF0cwogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdJVFNNU3RhdHMnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLWNvbmZpZ2l0ZW0KICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tY29uZmlnaXRlbScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENvbmZpZ0l0ZW0gbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGluc3RhbGwgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbnMKICAgICRTZWxmLT5fQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgbGFzdF92ZXJzaW9uX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBpbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbV92ZXJzaW9uIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5VmVyc2lvbkluY2lkZW50U3RhdGVJRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkIHJvd3MgaW4gY29uZmlnaXRlbSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eUluY2lkZW50QW5kRGVwbG95bWVudFN0YXRlSUQoKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgdGhlIGdyb3VwIGl0c20tY29uZmlnaXRlbQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jb25maWdpdGVtJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnR3JvdXAgZm9yIElUU00gQ29uZmlnSXRlbSBtYXNrIGFjY2VzcyBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicsCiAgICApOwoKICAgICMgaW5zdGFsbCBjb25maWcgaXRlbSBkZWZpbml0aW9ucwogICAgJFNlbGYtPl9BZGRDb25maWdJdGVtRGVmaW5pdGlvbnMoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBsYXN0X3ZlcnNpb25faWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKICAgICMgZmlsbHVwIGVtcHR5IGluY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgcm93cyBpbiBjb25maWdpdGVtIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPntTdGF0c09iamVjdH0tPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpbnN0YWxsIGNvbmZpZyBpdGVtIGRlZmluaXRpb25zCiAgICAkU2VsZi0+X0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucygpOwoKICAgICMgZmlsbHVwIGVtcHR5IGxhc3RfdmVyc2lvbl9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlMYXN0VmVyc2lvbklEKCk7CgogICAgIyBmaWxsdXAgZW1wdHkgaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW1fdmVyc2lvbiB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKTsKCiAgICAjIGZpbGx1cCBlbXB0eSBjdXJfZGVwbF9zdGF0ZV9pZCBvciBjdXJfaW5jaV9zdGF0ZV9pZCByb3dzIGluIGNvbmZpZ2l0ZW0gdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGFsbCBsaW5rcyB3aXRoIGNvbmZpZyBpdGVtcwogICAgJFNlbGYtPl9MaW5rRGVsZXRlKCk7CgogICAgIyBkZWFjdGl2YXRlIHRoZSBncm91cCBpdHNtLWNvbmZpZ2l0ZW0KICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tY29uZmlnaXRlbScsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR3JvdXBBZGQoKQoKYWRkIGEgZ3JvdXAKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAndGhlLWdyb3VwLW5hbWUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgZ3JvdXAgZGVzY3JpcHRpb24uJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgY2hlY2sgaWYgZ3JvdXAgYWxyZWFkeSBleGlzdHMKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgcmVhY3RpdmF0ZSB0aGUgZ3JvdXAKICAgIGlmICgkR3JvdXBJRCkgewoKICAgICAgICAjIGdldCBjdXJyZW50IGdyb3VwIGRhdGEKICAgICAgICBteSAlR3JvdXBEYXRhID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVhY3RpdmF0ZSBncm91cAogICAgICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cFVwZGF0ZSgKICAgICAgICAgICAgJUdyb3VwRGF0YSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGFkZCB0aGUgZ3JvdXAKICAgIGVsc2UgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgQ29tbWVudCA9PiAkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29rdXAgdGhlIG5ldyBncm91cCBpZAogICAgbXkgJE5ld0dyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBhZGQgdXNlciByb290IHRvIHRoZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgIEdJRCAgICAgICAgPT4gJE5ld0dyb3VwSUQsCiAgICAgICAgVUlEICAgICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR3JvdXBEZWFjdGl2YXRlKCkKCmRlYWN0aXZhdGUgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwRGVhY3RpdmF0ZSgKICAgICAgICBOYW1lID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cERlYWN0aXZhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgZ3JvdXAgaWQKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICRQYXJhbXtOYW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGdldCBjdXJyZW50IGdyb3VwIGRhdGEKICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgZ3JvdXAKICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cFVwZGF0ZSgKICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7aW52YWxpZH0sCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucygpCgppbnN0YWxscyBDb25maWdJdGVtIGRlZmluaXRpb25zCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQWRkQ29uZmlnSXRlbURlZmluaXRpb25zKCk7Cgo9Y3V0CgpzdWIgX0FkZENvbmZpZ0l0ZW1EZWZpbml0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY29uZmlnIGl0ZW0gZGVmaW5pdGlvbnMKICAgIG15ICVEZWZpbml0aW9uID0gKAogICAgICAgIENvbXB1dGVyID0+ICJbCiAgICB7CiAgICAgICAgS2V5ID0+ICdWZW5kb3InLAogICAgICAgIE5hbWUgPT4gJ1ZlbmRvcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ01vZGVsJywKICAgICAgICBOYW1lID0+ICdNb2RlbCcsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnVHlwZScsCiAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q29tcHV0ZXI6OlR5cGUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnT3duZXInLAogICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdTZXJpYWxOdW1iZXInLAogICAgICAgIE5hbWUgPT4gJ1NlcmlhbCBOdW1iZXInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnT3BlcmF0aW5nU3lzdGVtJywKICAgICAgICBOYW1lID0+ICdPcGVyYXRpbmcgU3lzdGVtJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnQ1BVJywKICAgICAgICBOYW1lID0+ICdDUFUnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxNiwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdSYW0nLAogICAgICAgIE5hbWUgPT4gJ1JhbScsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgICAgIENvdW50TWF4ID0+IDEwLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0hhcmREaXNrJywKICAgICAgICBOYW1lID0+ICdIYXJkIERpc2snLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NhcGFjaXR5JywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhcGFjaXR5JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdGUUROJywKICAgICAgICBOYW1lID0+ICdGUUROJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05JQycsCiAgICAgICAgTmFtZSA9PiAnTmV0d29yayBBZGFwdGVyJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudE1heCA9PiAxMCwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMSwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ0lQb3ZlckRIQ1AnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVAgb3ZlciBESENQJywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06Olllc05vJywKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ0lQQWRkcmVzcycsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJUCBBZGRyZXNzJywKICAgICAgICAgICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA0MCwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAyMCwKICAgICAgICAgICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnR3JhcGhpY0FkYXB0ZXInLAogICAgICAgIE5hbWUgPT4gJ0dyYXBoaWMgQWRhcHRlcicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ090aGVyRXF1aXBtZW50JywKICAgICAgICBOYW1lID0+ICdPdGhlciBFcXVpcG1lbnQnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJywKICAgICAgICBOYW1lID0+ICdXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnSW5zdGFsbERhdGUnLAogICAgICAgIE5hbWUgPT4gJ0luc3RhbGwgRGF0ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05vdGUnLAogICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICB9LApdOyIsCiAgICAgICAgSGFyZHdhcmUgPT4gIlsKICAgIHsKICAgICAgICBLZXkgPT4gJ1ZlbmRvcicsCiAgICAgICAgTmFtZSA9PiAnVmVuZG9yJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTW9kZWwnLAogICAgICAgIE5hbWUgPT4gJ01vZGVsJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpIYXJkd2FyZTo6VHlwZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdPd25lcicsCiAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1NlcmlhbE51bWJlcicsCiAgICAgICAgTmFtZSA9PiAnU2VyaWFsIE51bWJlcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJywKICAgICAgICBOYW1lID0+ICdXYXJyYW50eSBFeHBpcmF0aW9uIERhdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0RhdGUnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnSW5zdGFsbERhdGUnLAogICAgICAgIE5hbWUgPT4gJ0luc3RhbGwgRGF0ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnRGF0ZScsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50TWF4ID0+IDEsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnTm90ZScsCiAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dEFyZWEnLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgfSwKXTsiLAogICAgICAgIExvY2F0aW9uID0+ICJbCiAgICB7CiAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpMb2NhdGlvbjo6VHlwZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdQaG9uZTEnLAogICAgICAgIE5hbWUgPT4gJ1Bob25lIDEnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnUGhvbmUyJywKICAgICAgICBOYW1lID0+ICdQaG9uZSAyJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0ZheCcsCiAgICAgICAgTmFtZSA9PiAnRmF4JywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0UtTWFpbCcsCiAgICAgICAgTmFtZSA9PiAnRS1NYWlsJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0FkZHJlc3MnLAogICAgICAgIE5hbWUgPT4gJ0FkZHJlc3MnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05vdGUnLAogICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICB9LApdOyIsCiAgICAgICAgTmV0d29yayA9PiAiWwogICAgewogICAgICAgIEtleSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpOZXR3b3JrOjpUeXBlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05ldHdvcmtBZGRyZXNzJywKICAgICAgICBOYW1lID0+ICdOZXR3b3JrIEFkZHJlc3MnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDMwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgIFJlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgIENvdW50TWF4ID0+IDEwMCwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMSwKICAgICAgICBTdWIgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1N1Ym5ldE1hc2snLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VibmV0IE1hc2snLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgPT4gMzAsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDIwLAogICAgICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnMjU1LjI1NS4yNTUuMCcsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMSwKICAgICAgICAgICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ0dhdGV3YXknLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnR2F0ZXdheScsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAzMCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDb3VudE1pbiA9PiAwLAogICAgICAgICAgICAgICAgQ291bnRNYXggPT4gMTAsCiAgICAgICAgICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05vdGUnLAogICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnRNYXggPT4gMSwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCl07IiwKICAgICAgICBTb2Z0d2FyZSA9PiAiWwogICAgewogICAgICAgIEtleSA9PiAnVmVuZG9yJywKICAgICAgICBOYW1lID0+ICdWZW5kb3InLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgICBNYXhMZW5ndGggPT4gNTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDUwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdUZXh0QXJlYScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICBTZWFyY2hhYmxlID0+IDEsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpTb2Z0d2FyZTo6VHlwZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdPd25lcicsCiAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ1NlcmlhbE51bWJlcicsCiAgICAgICAgTmFtZSA9PiAnU2VyaWFsIE51bWJlcicsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ0xpY2VuY2VUeXBlJywKICAgICAgICBOYW1lID0+ICdMaWNlbmNlIFR5cGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ0dlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OlNvZnR3YXJlOjpMaWNlbmNlVHlwZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdMaWNlbmNlS2V5JywKICAgICAgICBOYW1lID0+ICdMaWNlbmNlIEtleScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNTAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnRNYXggPT4gMTAwLAogICAgICAgIENvdW50RGVmYXVsdCA9PiAwLAogICAgICAgIFN1YiA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUXVhbnRpdHknLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVhbnRpdHknLAogICAgICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0ludGVnZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlTWluID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXggPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnRXhwaXJhdGlvbkRhdGUnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwaXJhdGlvbiBEYXRlJywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdEYXRlJywKICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgICAgICAgICBDb3VudE1heCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnREZWZhdWx0ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdNZWRpYScsCiAgICAgICAgTmFtZSA9PiAnTWVkaWEnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgPT4gJ05vdGUnLAogICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRBcmVhJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgICAgIENvdW50TWluID0+IDAsCiAgICAgICAgQ291bnRNYXggPT4gMSwKICAgICAgICBDb3VudERlZmF1bHQgPT4gMCwKICAgIH0sCl07IiwKICAgICk7CgogICAgIyBnZXQgbGlzdCBvZiBpbnN0YWxsZWQgY29uZmlnIGl0ZW0gY2xhc3NlcwogICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKICAgIG15ICVSZXZlcnNlQ2xhc3NMaXN0ID0gcmV2ZXJzZSAleyRDbGFzc0xpc3R9OwoKICAgIENMQVNTTkFNRToKICAgIGZvciBteSAkQ2xhc3NOYW1lICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJURlZmluaXRpb24gKSB7CgogICAgICAgICMgY2hlY2sgaWYgY2xhc3MgZXhpc3RzCiAgICAgICAgbXkgJENsYXNzSUQgPSAkUmV2ZXJzZUNsYXNzTGlzdHskQ2xhc3NOYW1lfTsKCiAgICAgICAgbmV4dCBDTEFTU05BTUUgaWYgISRDbGFzc0lEOwoKICAgICAgICAjIGNoZWNrIGlmIGRlZmluaXRpb24gYWxyZWFkeSBleGlzdHMKICAgICAgICBteSAkRGVmaW5pdGlvbkxpc3QgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5EZWZpbml0aW9uTGlzdCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICBuZXh0IENMQVNTTkFNRSBpZiAhZGVmaW5lZCAkRGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgbmV4dCBDTEFTU05BTUUgaWYgJERlZmluaXRpb25MaXN0ICYmIHJlZiAkRGVmaW5pdGlvbkxpc3QgZXEgJ0FSUkFZJyAmJiBAeyREZWZpbml0aW9uTGlzdH07CgogICAgICAgICMgYWRkIHRoZSBuZXcgZGVmaW5pdGlvbgogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkRlZmluaXRpb25BZGQoCiAgICAgICAgICAgIENsYXNzSUQgICAgPT4gJENsYXNzSUQsCiAgICAgICAgICAgIERlZmluaXRpb24gPT4gJERlZmluaXRpb257JENsYXNzTmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTGlua0RlbGV0ZSgpCgpkZWxldGUgYWxsIGV4aXN0aW5nIGxpbmtzIHRvIGNvbmZpZyBpdGVtcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0xpbmtEZWxldGUoKTsKCj1jdXQKCnN1YiBfTGlua0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjb25maWcgaXRlbXMKICAgIG15ICRDb25maWdJdGVtSURzID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaCgpOwoKICAgIHJldHVybiBpZiAhJENvbmZpZ0l0ZW1JRHM7CiAgICByZXR1cm4gaWYgcmVmICRDb25maWdJdGVtSURzIG5lICdBUlJBWSc7CgogICAgIyBkZWxldGUgdGhlIGNvbmZpZyBpdGVtIGxpbmtzCiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JENvbmZpZ0l0ZW1JRHN9ICkgewogICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGVBbGwoCiAgICAgICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBLZXkgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgbGFzdF92ZXJzaW9uX2lkIGNvbHVtbiBvZiB0aGUgY29uZmlnaXRlbSB0YWJsZQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpbGx1cEVtcHR5TGFzdFZlcnNpb25JRCgpOwoKPWN1dAoKc3ViIF9GaWxsdXBFbXB0eUxhc3RWZXJzaW9uSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgaXRlbXMgd2l0aCBlbXB0eSBsYXN0X3ZlcnNpb25faWQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZmlnaXRlbSBXSEVSRSAnCiAgICAgICAgICAgIC4gJ2xhc3RfdmVyc2lvbl9pZCA9IDAgT1IgbGFzdF92ZXJzaW9uX2lkIElTIE5VTEwnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25maWdJdGVtSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkUm93WzBdOwogICAgfQoKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlEcykgewoKICAgICAgICAjIGdldCB0aGUgbGFzdCB2ZXJzaW9uIG9mIHRoaXMgY29uZmlnIGl0ZW0KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gT1JERVIgQlkgaWQgREVTQycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkVmVyc2lvbklEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRWZXJzaW9uSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRWZXJzaW9uSUQ7CgogICAgICAgICMgdXBkYXRlIGluY2lfc3RhdGVfaWQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gJwogICAgICAgICAgICAgICAgLiAnU0VUIGxhc3RfdmVyc2lvbl9pZCA9ID8gJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVmVyc2lvbklELCBcJENvbmZpZ0l0ZW1JRCBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKQoKZmlsbHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIGluY2lfc3RhdGVfaWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtX3ZlcnNpb24gdGFibGUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9GaWxsdXBFbXB0eVZlcnNpb25JbmNpZGVudFN0YXRlSUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlWZXJzaW9uSW5jaWRlbnRTdGF0ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgb3BlcmF0aW9uYWwgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBpZiAoICEkSW5jaVN0YXRlTGlzdCB8fCByZWYgJEluY2lTdGF0ZUxpc3QgbmUgJ0hBU0gnIHx8ICEleyRJbmNpU3RhdGVMaXN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgYW55IGl0ZW0gaW4gZ2VuZXJhbCBjYXRhbG9nIGNsYXNzIElUU006OkNvcmU6OkluY2lkZW50U3RhdGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNvcnQgaWRzCiAgICBteSBASW5jaVN0YXRlS2V5TGlzdCA9IHNvcnQga2V5cyAleyRJbmNpU3RhdGVMaXN0fTsKCiAgICAjIHVwZGF0ZSBpbmNpX3N0YXRlX2lkCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW1fdmVyc2lvbiAnCiAgICAgICAgICAgIC4gJ1NFVCBpbmNpX3N0YXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGluY2lfc3RhdGVfaWQgPSAwIE9SIGluY2lfc3RhdGVfaWQgSVMgTlVMTCcsCiAgICAgICAgQmluZCA9PiBbIFwkSW5jaVN0YXRlS2V5TGlzdFswXSBdLAogICAgKTsKfQoKPWl0ZW0gX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCgpCgpmaWxsdXAgZW1wdHkgZW50cmllcyBpbiB0aGUgY3VyX2RlcGxfc3RhdGVfaWQgb3IgY3VyX2luY2lfc3RhdGVfaWQgY29sdW1uIG9mIHRoZSBjb25maWdpdGVtIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlJbmNpZGVudEFuZERlcGxveW1lbnRTdGF0ZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5SW5jaWRlbnRBbmREZXBsb3ltZW50U3RhdGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyB3aXRoIGVtcHR5IGN1cl9kZXBsX3N0YXRlX2lkIG9yIGN1cl9pbmNpX3N0YXRlX2lkCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgJwogICAgICAgICAgICAuICdjdXJfZGVwbF9zdGF0ZV9pZCA9IDAgT1IgY3VyX2RlcGxfc3RhdGVfaWQgSVMgTlVMTCBPUiAnCiAgICAgICAgICAgIC4gJ2N1cl9pbmNpX3N0YXRlX2lkID0gMCBPUiBjdXJfaW5jaV9zdGF0ZV9pZCBJUyBOVUxMJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoQENvbmZpZ0l0ZW1JRHMpIHsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgISRMYXN0VmVyc2lvbjsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiByZWYgJExhc3RWZXJzaW9uIG5lICdIQVNIJzsKICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAhJExhc3RWZXJzaW9uLT57RGVwbFN0YXRlSUR9OwogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVJRH07CgogICAgICAgICMgY29tcGxldGUgY29uZmlnIGl0ZW0KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmZpZ2l0ZW0gU0VUICcKICAgICAgICAgICAgICAgIC4gJ2N1cl9kZXBsX3N0YXRlX2lkID0gPywgJwogICAgICAgICAgICAgICAgLiAnY3VyX2luY2lfc3RhdGVfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRMYXN0VmVyc2lvbi0+e0RlcGxTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFwkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBcJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xNCAkICREYXRlOiAyMDA5LzA4LzE5IDIyOjQ4OjE0ICQKCj1jdXQK
ITSM::ConfigItem::Class
Computer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Hardware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Network
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Software
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Expired
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Inactive
postproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Maintenance
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Pilot
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Planned
preproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Production
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Repair
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Retired
postproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Review
productive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::DeploymentState
Test/QA
preproductive
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
Yes
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::YesNo
No
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Laptop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Desktop
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Phone
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
PDA
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Computer::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Monitor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Printer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Switch
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Router
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
WLAN Access Point
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Security Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Backup Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Mouse
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Keybord
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Camera
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Beamer
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Modem
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
PCMCIA Card
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
USB Device
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Docking Station
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Scanner
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Hardware::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Building
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Office
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Floor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Room
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Rack
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Workplace
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Outlet
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
IT Facility
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Location::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
LAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
WLAN
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Telco
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
GSM
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Network::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Middleware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server Application
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Client OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Server OS
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Admin Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
User Tool
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Embedded
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Single Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per User
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Concurrent Users
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Processor
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Server
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Per Node
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Volume Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Enterprise Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Developer Licence
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Demo
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Time Restricted
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Freeware
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Open Source
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Software::LicenceType
Unlimited
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1
ITSM::ConfigItem::Class
Location
1
current_timestamp
1
current_timestamp
1
ConfigItemCreate
1
current_timestamp
1
current_timestamp
1
ConfigItemDelete
1
current_timestamp
1
current_timestamp
1
LinkAdd
1
current_timestamp
1
current_timestamp
1
LinkDelete
1
current_timestamp
1
current_timestamp
1
NameUpdate
1
current_timestamp
1
current_timestamp
1
VersionCreate
1
current_timestamp
1
current_timestamp
1
ValueUpdate
1
current_timestamp
1
current_timestamp
1
DefinitionUpdate
1
current_timestamp
1
current_timestamp
1
IncidentStateUpdate
1
current_timestamp
1
current_timestamp
1
DeploymentStateUpdate
1
current_timestamp
1
current_timestamp
1
VersionDelete
1
current_timestamp
1
current_timestamp
1